Philip Roberts fa un ottimo lavoro spiegando il ciclo di eventi del browser here fornendo una chiara spiegazione tra lo stack di chiamata, il loop di eventi, la coda di attività e quindi i thread "esterni" come webapis. La mia domanda è fare questi paralleli i componenti equivalenti nel ciclo degli eventi del nodo e sono chiamati praticamente la stessa cosa. Cioè, quando faccio una chiamata usando le librerie di i/o file e web di Node, sono cose che accadono fuori dallo stack le cui callback sono accodate in una coda di task?Esistono differenze significative tra il ciclo degli eventi del browser Chrome e il ciclo degli eventi del nodo?
risposta
... quando effettuo una chiamata utilizzando le librerie di file e di I/O Web di Node, si verificano cose che si verificano al di fuori dello stack le cui richiamate sono accodate in una coda di attività?
Sì, assolutamente; sono asincroni come Ajax e setTimeout
sono asincroni. Eseguono alcune operazioni al di fuori dello stack di chiamate e al termine dell'operazione aggiungono un evento alla coda che deve essere elaborato dal ciclo degli eventi.
L'API del nodo fornisce una sorta di no-op asincrono, . Per quella funzione, "alcune operazioni" che ho menzionato sopra sono "non fare nulla", dopo di che un elemento viene immediatamente aggiunto alla fine della coda degli eventi.
C'è un più potente che aggiunge un evento allo anteriore della coda eventi, tagliando in modo efficace in linea e rendendo tutti gli altri eventi in coda in attesa. Se chiamato in modo ricorsivo, ciò può causare un ritardo prolungato per altri eventi (fino al raggiungimento di maxTickDepth
).
FWIW: Node.js e Chrome fanno ** non ** utilizzano la stessa implementazione del ciclo di eventi. Chrome/Chromium utilizza libevent, mentre node.js usa libuv. – mscdex
@mscdex dire whaaaaat - buono a sapersi; Modificherò AL PIÙ PRESTO. Se hai qualche riferimento a portata di mano, mi piacerebbe inserirli (cercherò io stesso, naturalmente, e vedrò se riesco a trovarne uno mio). – apsillers
[Qui] (https://chromium.googlesource.com/chromium/chromium/+/master/third_party/libevent/README.chromium) è l'albero dei sorgenti di Chromium che contiene libevent. [Qui] (https://github.com/joyent/node/blob/962e651476ce2035ce6e15eff5abd0f9c54e039c/src/node.cc#L3629-L3640) è un nodo che usa libuv per il ciclo degli eventi principale. Entrambi usano comunque v8 e tutto ciò che viene fornito (sebbene il nodo possa utilizzare versioni diverse di v8 rispetto a Chrome perché Chrome si aggiorna abbastanza regolarmente). – mscdex
sì, l'idea centrale è la stessa. node.js utilizza il motore JS di Chrome. – dandavis
@apsillers Concordato. Sto solo cercando di determinare se ci fossero delle principali differenze concettuali di cui essere a conoscenza. – JohnGalt
Un browser potrebbe avere più loop di eventi (per JS, per DOM, ecc.), Ma il concetto è lo stesso, sì. – Bergi