Compreendendo a alternativa JS do nó ao multithreading


142

Se eu entendi corretamente, o Nó JS não está bloqueando ... então, em vez de esperar por uma resposta de um banco de dados ou outro processo, ele passou para outra coisa e verifica novamente mais tarde.

Também é de rosca única.

Tudo isso significa que um determinado processo Node JS pode utilizar de maneira completa e eficiente um único núcleo da CPU, mas não usará nenhum outro núcleo na máquina, pois nunca usará mais de um por vez.

Isso obviamente significa que as outras CPUs ainda podem ser usadas por outros processos para coisas como banco de dados SQL ou outras sub-rotinas pesadas de CPU separadas intencionalmente, desde que sejam um processo separado.

Também no caso em que o processo Node JS possui um loop sem fim ou função de execução longa, esse processo não é mais útil até que o loop sem fim ou a função de execução longa seja interrompido (ou todo o processo seja eliminado).

Está tudo certo? Estou correto no meu entendimento?


2
"Nó" não é de thread único. Somente o mecanismo JS / V8 é executado em um único encadeamento. A parte libuv do NodeJS é multiencadeada. Veja NodeJS é realmente Single-Threaded?
RaelB 20/09/16

Respostas:


87

Praticamente correto, sim. O servidor node.js possui um conjunto de encadeamentos internos para poder executar operações de bloqueio e notificar o encadeamento principal com um retorno de chamada ou evento quando as coisas terminarem.

Portanto, imagino que ele fará uso limitado de outro núcleo para o pool de threads, por exemplo, se você fizer uma leitura do sistema de arquivos sem bloqueio, isso provavelmente será implementado, informando um thread do pool de threads para executar uma leitura e definir um retorno de chamada quando isso é feito, o que significa que a leitura pode estar acontecendo em um thread / core diferente enquanto o programa node.js principal está fazendo outra coisa.

Mas, do ponto de vista do node.js., ele é totalmente único e não usa diretamente mais de um núcleo.


2
Ainda sou novo no Node.js e aprecio a discussão aqui. Eu só queria salientar que fazer suposições de que chamadas sem bloqueio são apoiadas por chamadas de bloqueio encadeadas provavelmente não é sábio (não que o @jcoder sugerisse que o código de arquitetura fosse baseado nessas suposições). Nesse caso, mesmo que o IO seja tratado em um thread separado com uma chamada de bloqueio, esse thread basicamente aguardará o IO de qualquer maneira, para não usar outros núcleos / CPUs. Codifique a força das ferramentas que você está usando e não se preocupe muito com os detalhes de baixo nível (até que se tornem um problema).
precisa saber é

para que possamos fazer outras prosas usando callback como o código javascript no frontend
yussan

37

Sim, eu diria que sua compreensão está totalmente correta. Este artigo ( arquivado ) explica muito bem a lógica por trás desse design. Este é provavelmente o parágrafo mais importante:

O Apache é multithread: gera um encadeamento por solicitação (ou processo, depende do conf). Você pode ver como essa sobrecarga consome memória à medida que o número de conexões simultâneas aumenta e mais threads são necessários para atender a vários clientes simultâneos. Nginx e Node.js não são multithread, porque threads e processos têm um alto custo de memória. Eles são de thread único, mas baseados em eventos. Isso elimina a sobrecarga criada por milhares de threads / processos, manipulando muitas conexões em um único thread.


O artigo é falso. Embora exista um apache mpm multithread, ele é incompatível com praticamente todas as configurações diárias usadas. O Apache é multiprocesso, e não é multithread até agora, e provavelmente será para sempre. Acho catastrófico, manipular os significados apropriados da terminologia é apenas uma boa tentativa de esconder o problema, em vez de resolvê-lo.
peterh - Restabelece Monica

1
@ Peter Você não está fazendo sentido. O artigo está completamente correto, afirmando que o apache é multiprocesso ou multithread, dependendo da configuração. O caso multiprocessos é ainda pior no que diz respeito ao manuseio de muitas conexões, que é a única razão pela qual o Apache é mencionado em primeiro lugar. Além disso, o módulo PHP muito usado é multithread por conta própria. E, finalmente, embora eu não seja um especialista em apache, minha impressão de outros artigos é que o MPM de trabalho é de fato muito comum.
22817 Michael Borgwardt

@MichaelBorgwardt Sim, o apache pode ser multithread e também multiprocess, eu não neguei. Mas o php é incompatível com a configuração de multiprocessos, e se você fosse um especialista em apache, certamente o conheceria. O módulo php muito usado não é multithread. Sua informação é falsa. Sugiro tentar uma configuração de teste e você verá. É uma coisa factual, não é questão de debate, tente e você verá.
peterh - Restabelece Monica

27

Mesmo se esse fosse um tópico antigo, pensei, que eu compartilharia com uma ideia de como utilizar mais de um núcleo no aplicativo Node.JS. Como Nuray Altin mencionou - o JXcore pode fazer isso.

Exemplo simples:

var method = function () {
    console.log("this is message from thread no", process.threadId);
};

jxcore.tasks.runOnThread(0, method);
jxcore.tasks.runOnThread(1, method);

// this is message from thread no 1
// this is message from thread no 0

Por padrão, existem dois threads (você pode alterá-lo com jxcore.tasks.setThreadCount())

Claro que há muito mais que você pode fazer com tarefas. Os documentos estão aqui .

Poucos artigos sobre esse assunto:



1

O Node.js é um aplicativo de thread único, mas pode oferecer suporte à simultaneidade por meio do conceito de evento e retornos de chamada. Aqui está o vídeo de Philip Roberts, que explica como os loops de eventos funcionam em javascript.

Clique aqui para ver o vídeo

(Em vez de WebAPIs, existem APIs C ++ no Node.js)


2
Este deve ser um comentário
Cherniv
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.