2012-01-24 10 views
53

Stavo passando attraverso i dettagli di node.js e sono venuto a sapere che, supporta la programmazione asincrona anche se essenzialmente fornisce un singolo modello a thread.Come funziona la programmazione asincrona in un modello di programmazione a thread singolo?

Come viene gestita la programmazione asincrona in questi casi? È come se il runtime stesso crea e gestisce i thread, ma il programmatore non può creare i thread esplicitamente? Sarebbe bello se qualcuno potesse indicarmi alcune risorse per conoscere questo.

risposta

70

Dillo ora con me: programmazione asincrona non significa necessariamente multi-thread.

Javascript è un runtime a thread singolo - semplicemente non è possibile creare nuovi thread in JS perché la lingua/runtime non lo supporta.

Frank lo dice correttamente (anche se in modo ottusamente) In inglese: c'è un ciclo di eventi principale che gestisce quando le cose entrano nella tua app. Quindi, "gestire questa richiesta HTTP" verrà aggiunto alla coda degli eventi, quindi gestita dal ciclo degli eventi quando appropriato.

Quando si chiama un'operazione asincrona (una query db mysql, ad esempio), node.js invia "hey, esegui questa query" a mysql. Poiché questa query impiegherà un po 'di tempo (millisecondi), node.js esegue la query utilizzando la libreria async MySQL - tornando al ciclo degli eventi e facendo qualcos'altro lì mentre si aspetta mysql per tornare a noi. Come gestire quella richiesta HTTP.

Edit: Al contrario, Node.js potrebbe semplicemente aspettare (non fare nulla) per MySQL per tornare ad essa. Questo è chiamato una chiamata sincrona. Immagina un ristorante, dove il tuo cameriere sottopone il tuo ordine al cuoco, poi si siede e rigirizza i pollici mentre lo chef cucina. In un ristorante, come in un programma node.js, un comportamento del genere è folle: hai altri clienti affamati e che devono essere serviti. Quindi vuoi essere il più asincrono possibile per assicurarti che un cameriere (o un processo node.js) serva quante più persone possibile.

Modifica fatto

Node.js comunica con mysql con librerie C, quindi tecnicamente quelle librerie C potrebbe deporre le uova fuori le discussioni, ma dentro Javascript non si può fare nulla con i thread.

+9

Più precisamente. "Node.js comunica con mysql attraverso un'API asincrona.L'implementazione dell'API asincrona è in C e l'implementazione può essere eseguita semplicemente tramite l'API sincrona attraverso un threadpool". Il fatto che l'API asincrona possa utilizzare internamente un pool di thread è un dettaglio di basso livello di cui non ti importa. – Raynos

+0

Ah, quindi mysql è in esecuzione in un thread diverso, quindi aggiunge un evento a JS quando viene eseguito.Se volessi creare un mio modulo asincrono, potrei usare i processi figli nel nodo per ottenere lo stesso effetto. – BigOmega

+3

Penso che sia davvero meglio evitare la stessa parola 'filo' qui: la gente salta a conclusioni false quando la sentono. una chiamata asincrona può utilizzare un thread o eseguire il fork di un processo o fare qualsiasi cosa; la cosa importante è che potrebbe verificarsi una richiamata o un evento più avanti nel ciclo degli eventi. – flow

8

Ryan lo ha detto meglio: sync/async è ortogonale a single/multi-threaded. Per i casi single e multi-thread c'è un ciclo di eventi principale che chiama callback registrati usando lo Reactor Pattern. Per il caso a thread singolo i callback vengono richiamati in sequenza sul thread principale. Per il caso multi-thread vengono invocati su thread separati (in genere utilizzando un pool di thread). È davvero una questione di quanto contesa ci sarà: se tutte le richieste richiedono l'accesso sincronizzato a una singola struttura di dati (ad esempio un elenco di abbonati), i vantaggi di avere più thread possono essere diminuiti. È dipendente dal problema.

Per quanto riguarda l'implementazione, se un framework è a thread singolo, è probabile che si utilizzi la chiamata di sistema poll/select e il sistema operativo stia attivando l'evento asincrono.

Problemi correlati