Qual é a diferença entre a arquitetura orientada a eventos do Node.js. e a programação multithread em outros idiomas?


resposta 1:

Tanto no paradigma orientado a eventos quanto no multithread, o código é executado dentro de um processo do sistema operacional.

Quando o processo executa vários threads, esses threads compartilham a memória do processo (espaço de endereço) para leitura e gravação.

O JavaScript que alimenta o Node.js possui um encadeamento único por design. É garantido que todas as funções sejam executadas até a conclusão e nenhum outro código JavaScript no processo atual será executado durante essa execução. Os eventos naturalmente assíncronos (rede, entrada e saída de disco, timers, outros eventos de hardware e sistema operacional) são manipulados pelo mecanismo que adiciona as funções JavaScript registradas como manipuladores (ou retornos de chamada) para esses eventos na fila de loop de eventos a ser executada após as funções na frente da fila foram concluídas.

No paradigma multiencadeado, dois ou mais encadeamentos executam código em paralelo; portanto, durante a execução de uma função, um trecho de código diferente também pode ser executado em um núcleo de processador diferente, possivelmente lendo ou gravando nos mesmos endereços de memória. Isso pode resultar em um estado inconsistente da memória, a menos que mecanismos especiais do sistema operacional (primitivas de sincronização) sejam usados ​​pelo código para gerenciar o acesso à memória compartilhada.



resposta 2:

Essa é uma boa pergunta: "Qual é a diferença entre a arquitetura orientada a eventos do Node.js. e a programação multithread em outros idiomas?".

Podemos e devemos detalhar isso um pouco.

  • Arquitetura orientada a eventos do nó.

A arquitetura orientada a eventos não é exclusiva do Node, por exemplo, Tornado (Python), Vertx (Java), Akka (Scala), ReactiveX (vários idiomas).

  • Programação multithread em outros idiomas.

Observe que o JavaScript, por design, não suporta vários threads. Embora ele suporte webworkers, que, tanto quanto eu sei, pode funcionar como threads.

Portanto, orientado a eventos não é exclusivo do Nó e a multiencadeamento pode ser realizada no Nó.

Portanto, pode haver duas perguntas aqui: "Qual é a diferença entre segmentado por eventos e multiencadeamento" e "Qual é a diferença entre o Nó e outros idiomas (estruturas)". Vou me concentrar no último, pois essa parece ser a intenção da pergunta.

Eu diria que o que torna o Node especial é que o autor o criou com o objetivo de evitar o bloqueio de E / S ao criar aplicativos da Web. A cultura da comunidade Node é enfatizar e desenvolver a força do IO sem bloqueio. Você não encontrará muitas bibliotecas de terceiros que executam o bloqueio de chamadas. Como um desenvolvedor que usa o Node, é improvável que você execute operações de bloqueio sutis no seu código. Enquanto em outros idiomas, um desenvolvedor ingênuo pode acidentalmente executar chamadas de bloqueio altamente ineficientes, como a leitura de uma conexão com o banco de dados.

Fora isso, você realmente deve ler sobre vários modelos de “simultaneidade” e entender os prós e contras de cada um. Pontos de bônus por avaliar por que o multi-threading era aceitável por tanto tempo.



resposta 3:

as diferenças conceituais são bem fáceis de entender.

Na arquitetura orientada a eventos, seu programa é executado em um loop único e contínuo (você pode executar vários threads no nó, mas não se preocupe com isso agora). Quando um evento é acionado, há um trabalho na pilha de chamadas a ser tratado no lazer do programa.

A arquitetura multiencadeada geralmente despacha um novo encadeamento quando deve aguardar uma ação. Portanto, você faz uma chamada para um banco de dados e cria um novo encadeamento que executa todas as coisas necessárias e faz o que você precisa e conclui ou volta ao encadeamento original.

Ambos os métodos são muito úteis para coisas diferentes. O evento controlado é excelente para a interface do usuário e os servidores, porque o seu programa não sabe quando um novo evento acontecerá e, muitas vezes, os eventos ocorrerão em grande quantidade. Embora a segmentação seja necessária para trabalhos computacionalmente pesados, em que você deseja dividir um problema em partes muito menores (ou você está se aproximando do limite do seu loop único).