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.
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
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
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