Resumindo: o Nodejs é de thread único? Paralelismo x Simultaneidade

Dec 07 2022
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. Por causa deste artigo “curto”, vamos definir o seguinte: Dito isso, o nodejs usa um loop de evento javascript (encadeamento único, igual ao javascript, mas simultâneo) para gerenciar solicitações, mas encadeamento único se aplica apenas ao gerenciador das solicitações, o que não se aplica necessariamente no caso de atendimento de cada solicitação.
Tópicos NodeJS!

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.
  • Figura 1 Paralelismo e simultaneidade

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