2013-08-06 21 views
7

Sono nuovo a nodeJS e mi chiedevo il modello a nodo singolo del nodo. In una semplice applicazione nodeJs, quando alcune operazioni di blocco sono gestite in modo asincrono con i callback, il thread principale che esegue il nodoJs gestisce anche il callback ?. Se la richiesta è di prelevare alcuni dati dal database, e ci sono 100s di utenti concorrenti, e ogni operazione di db impiega un paio di secondi, quando il callback è finalmente attivato (per ciascuna delle connessioni), è il thread principale che accetta questi richieste utilizzate per eseguire anche la callback? In tal caso, in che modo vengono scalati i nodiJJ e in che modo reagisce così velocemente ?.Meccanismo di callback Nodejs - quale thread gestisce il callback?

+0

Trovato molto utile: http://rickgaribay.net/archive/2012/01/28/node-is-not-single-threaded.aspx – Rakesh

risposta

9

Ogni istanza di nodejs viene eseguita in un singolo thread. Periodo. Quando si effettua una chiamata asincrona, ad esempio, a una richiesta di rete, essa non attende, non nel codice o in qualsiasi altro luogo. Ha un ciclo di eventi che attraversa. Quando la risposta è pronta, richiama la tua richiamata.

Questo può essere incredibilmente performante, perché non ha bisogno di molti thread e tutto il sovraccarico della memoria, ma significa che devi fare attenzione a non fare blocchi sincroni.

C'è una spiegazione abbastanza decente del ciclo degli eventi a http://blog.mixu.net/2011/02/01/understanding-the-node-js-event-loop/ e la presentazione originale di jsconf di Ryan Dahl http://www.youtube.com/watch?v=ztspvPYybIY vale la pena guardare. Hai mai visto un ingegnere ricevere una standing ovation per una presentazione tecnica?

+1

Questo è ancora un po 'poco chiaro per me. Quindi, se ci sono 100 utenti simultanei, ci sarà solo una istanza di nodo in esecuzione o 100 ?. Considerando che c'è una chiamata asynch con un callback e il thread (ad esempio threadA) esce da quel pezzo di codice dopo aver inserito la richiesta network/db, quando viene attivato il callback, è threadA che esegue questo callback ?. – Rakesh

+2

Sì. Se ci sono 100 "utenti concorrenti" (cioè gli utenti che fanno richieste di rete dell'istanza nodejs), allora c'è ancora solo un'istanza di nodo. Quando viene effettuata la richiesta, il singolo thread lo gestisce. Quando esegue una chiamata asincrona per leggere un file o accedere a un servizio di rete o altro, è sempre lo stesso thread. Una volta effettuato l'accesso e richiamato il callback, è sempre lo stesso thread. È possibile * avere istanze di modalità multiple in esecuzione, se è possibile eseguirle con una sorta di bilanciamento del carico, e il cluster di nodi è pianificato ma è ancora sperimentale. – deitch

+0

@deitch Come può l'unico thread non bloccare quando fa 100 cose allo stesso tempo? Diciamo delle 100 cose, ognuna richiede 1 secondo per essere completata, se tutte sono in 1 thread, devono essere fatte in serie, quindi vuol dire che bloccherà per 100 secondi? –

Problemi correlati