Resumindo: o Nodejs é de thread único? Paralelismo x Simultaneidade
Você encontrará muitas “opiniões” diferentes on-line, o que exige que algumas delas estejam erradas! Até mesmo entrevistadores me fizeram essas perguntas e consideraram minha resposta errada, quando na verdade eu estava certo!
Portanto, para encurtar a história, primeiro precisamos saber a diferença entre concorrência e paralelismo.
Para o bem deste “pequeno” artigo, vamos definir o seguinte:
- simultaneidade: as threads estão competindo (gerenciadas pela cpu, ou pelo próprio software) pelo tempo da CPU; a CPU está processando apenas um thread por vez, mas está alternando entre os threads (possivelmente em alta frequência), criando a ilusão de paralelismo, definitivamente não esperando que uma tarefa inteira termine antes de executar a próxima.
- paralelismo: threads rodando em diferentes núcleos da CPU; a CPU está executando os dois threads ao mesmo tempo e, portanto, estão executando simultaneamente.
Dito isto, o nodejs usa um loop de evento javascript (encadeamento único, igual ao javascript, mas simultâneo) para gerenciar solicitações, mas o encadeamento único se aplica apenas ao gerenciador das solicitações, o que não se aplica necessariamente no caso de atendimento de cada pedido.
Como a funcionalidade subjacente pode ser paralela se o próprio javascript e o loop de eventos forem de thread único? Duas razões:
1- Biblioteca Libuv que executa operações io em paralelo usando código baseado em c++
2- Worker threads, que foram introduzidos no nó v10, e basicamente geram um motor v8 para cada thread; o que significa que temos vários threads, cada um com seu próprio loop de eventos, e eles podem ser executados simultaneamente.
O importante aqui é que o uso de um modelo simultâneo para enfileirar solicitações (como usar o loop de eventos no nodejs) provou ser mais eficiente em escala do que o enfileiramento paralelo de solicitações (como gerar um novo processo por solicitação, por exemplo. PHP) devido à menor sobrecarga de gerenciamento de memória e encadeamento por solicitação.
Agora que sabemos que o javascript é de encadeamento único, mas o nodejs é multiencadeado; Python é único ou multi-thread? Deixe-me saber na seção de comentários, talvez tenhamos outra leitura rápida “em poucas palavras” sobre isso!
Leitura adicional:
- excelente exemplo prático com um benchmark (nodejs):
https:///softup-technologies/node-js-internals-not-everything-happens-on-the-thread-pool-a14d0a286efb - o loop de eventos:
https://www.freecodecamp.org/news/javascript-concurrency-model-and-event-loop/ - threads de trabalho do nodejs:
https://www.simplilearn.com/tutorials/nodejs-tutorial/nodejs-worker-threads - php processo/thread por solicitação:
https://stackoverflow.com/questions/5171639/creation-of-new-process-for-each-request-of-web-page - Imagem dos tópicos:
https://www.hunarcourses.com/blog/wp-content/uploads/2019/04/5-Types-Of-Threads-Used-In-Garment-Making.jpg





































![O que é uma lista vinculada, afinal? [Parte 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)