Comprendere l'alternativa JS al nodo multithreading


142

Se capisco correttamente il nodo JS non sta bloccando ... quindi invece di attendere una risposta da un database o da un altro processo è passato a qualcos'altro e ricontrolla più tardi.

Inoltre è a thread singolo.

Quindi tutto ciò significa che un determinato processo Node JS può utilizzare in modo completo ed efficiente un singolo core della CPU ma non utilizzerà nessun altro core sulla macchina, in quanto non ne utilizzerà mai più uno alla volta.

Questo ovviamente significa che le altre CPU possono ancora essere utilizzate da altri processi per cose come database SQL o altre subroutine di CPU volutamente separate fintanto che si tratta di un processo separato.

Anche nel caso in cui il processo Node JS abbia un ciclo infinito o una funzione di lunga durata, quel processo non è più utile in alcun modo fino a quando il ciclo infinito o la funzione di lunga durata viene interrotto (o l'intero processo viene interrotto).

Va tutto bene? Sono corretto nella mia comprensione?


2
"Nodo" non è a thread singolo. Solo il motore JS / V8 funziona in un singolo thread. La parte libuv di NodeJS è multi-thread. Vedi NodeJS è davvero single thread?
RaelB,

Risposte:


87

Abbastanza corretto, sì. Il server node.js ha un pool di thread interno in modo da poter eseguire operazioni di blocco e avvisare il thread principale con un callback o un evento al termine delle operazioni.

Quindi immagino che farà un uso limitato di un altro core per il pool di thread, ad esempio se si fa un file system non bloccante leggere questo è probabilmente implementato dicendo a un thread dal pool di thread di eseguire una lettura e impostare un callback quando è fatto, il che significa che la lettura potrebbe avvenire su un thread / core diverso mentre il programma node.js principale sta facendo qualcos'altro.

Ma dal punto di vista node.js, è interamente a thread singolo e non utilizzerà direttamente più di un core.


2
Sono ancora nuovo su Node.js e apprezzo la discussione qui. Volevo solo sottolineare che fare assunzioni secondo cui le chiamate non bloccanti sono supportate da chiamate bloccate con thread non è probabilmente saggio (non che @jcoder abbia suggerito di progettare il codice attorno a queste ipotesi). In questo caso, anche se l'IO viene gestito su un thread separato con una chiamata di blocco, quel thread sostanzialmente attenderà comunque l'IO, quindi non utilizzerà altri core / CPU. Metti alla prova la forza degli strumenti che stai utilizzando e non preoccuparti troppo dei dettagli di basso livello (fino a quando non diventano un problema).
wbyoung,

così possiamo fare altri pro utilizzando callback come codice javascript su frontend
yussan

37

Sì, direi che la tua comprensione è del tutto corretta. Questo articolo ( archiviato ) spiega abbastanza bene la logica alla base di questo disegno. Questo è probabilmente il paragrafo più importante:

Apache è multithread: genera un thread per richiesta (o processo, dipende dalla conf). Puoi vedere come quell'overhead consuma memoria all'aumentare del numero di connessioni simultanee e sono necessari più thread per servire più client simultanei. Nginx e Node.js non sono multithread, poiché thread e processi comportano un costo di memoria elevato. Sono a thread singolo, ma basati su eventi. Ciò elimina il sovraccarico creato da migliaia di thread / processi gestendo molte connessioni in un singolo thread.


L'articolo è falso Sebbene esista un mpm apache multithread, è incompatibile con praticamente tutte le configurazioni utilizzate quotidianamente. Apache è multiprocesso e finora non è multithread e probabilmente lo sarà per sempre. Lo trovo catastrofale, manipolare i significati propri della terminologia è solo un bel tentativo di nascondere il problema, invece di risolverlo.
Peter - Ripristina Monica il

1
@peterh Non hai senso. L'articolo è completamente corretto, affermando che apache è multiprocesso o multithread a seconda della configurazione. Il caso multiprocesso è ancora peggio per quanto riguarda la gestione di molte connessioni, che è l'unica ragione per cui Apache è menzionata in primo luogo. Inoltre, il modulo PHP molto comunemente usato è multithread da solo. E infine, anche se non sono un esperto di Apache, la mia impressione da altri articoli è che MPM lavoratore è in effetti molto comunemente usato.
Michael Borgwardt,

@MichaelBorgwardt Sì, l'apache può essere multithread e anche multiprocesso, non l'ho negato. Ma php non è compatibile con la configurazione multiprocesso, e se tu fossi un esperto di Apache lo sapresti sicuramente. Il modulo php molto comunemente usato non è multithread. Le tue informazioni sono false. Suggerisco di provare una configurazione di prova e vedrai. È una cosa concreta, non di discussione, provala e vedrai.
Peter - Ripristina Monica il

27

Anche se questo è un vecchio thread, ho pensato, che condividerei con un'idea, come utilizzare più di un core nell'app Node.JS. Come ha detto Nuray Altin, JXcore può farlo.

Esempio semplice:

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

Di default ci sono due thread (puoi cambiarlo con jxcore.tasks.setThreadCount())

Naturalmente c'è molto di più che puoi fare con le attività. I documenti sono qui .

Pochi articoli sull'argomento:



1

Node.js è un'applicazione a thread singolo, ma può supportare la concorrenza tramite il concetto di evento e callback. Ecco il video di Philip Roberts che spiega come funzionano i loop di eventi in javascript.

clicca qui per vedere il video

(Invece delle API Web ci sono API C ++ in Node.js)


2
Questo dovrebbe essere un commento
Cherniv
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.