Hogyan működik az eseményhurok (Event Loop) a Node.js-ben?
sobes.tech MI
Válasz az MI-től
Event Loop — ez egy mechanizmus, amely lehetővé teszi a Node.js számára, hogy nem blokkoló I/O műveleteket hajtson végre, annak ellenére, hogy a JavaScript egyszálú nyelv. Az Event Loop folyamatosan figyeli a hívásstack-et, a callback sorozatot és különböző esemény sorokat (időzítők, I/O).
Az Event Loop fő fázisai:
- timers: végrehajtja a
setTimeout()éssetInterval()által ütemezett callbackokat. - pending callbacks: végrehajtja a rendszer I/O műveleteinek callbackjait (pl. hálózati hibák), késleltetve a következő Event Loop iterációig.
- idle, prepare: belső fázisok az Event Loop-ban.
- poll:
- kiszámítja, mennyi ideig blokkoljon és kérdezze le az I/O műveleteket.
- feldolgozza az eseményeket az I/O callback sorban, amikor azok elérnek egy határt vagy az idő lejár.
- check: végrehajtja a
setImmediate()-tel ütemezett callbackokat. - close callbacks: végrehajtja a záró callbackokat, például a
socket.destroy().
A process.nextTick() és a mikrofeladatok (ígéretek, queueMicrotask()) között és a következő fázisra való áttérés vagy a jelenlegi befejezése előtt kerülnek végrehajtásra. A process.nextTick() magasabb prioritással rendelkezik, mint a mikrofeladatok.
// Feladatütemezési példák
console.log('Kezdet');
setTimeout(() => {
console.log('Időzítő 0');
}, 0);
setImmediate(() => {
console.log('setImmediate');
});
process.nextTick(() => {
console.log('nextTick');
});
Promise.resolve().then(() => {
console.log('Promise');
});
console.log('Vége');
// Tipikus végrehajtási sorrend (változhat Node.js verziótól és terheléstől függően):
// Kezdet
// Vége
// nextTick
// Promise
// Időzítő 0 (a timers fázisban fog végrehajtódni)
// setImmediate (a check fázisban fog végrehajtódni)
Az Event Loop lehetővé teszi a Node.js számára, hogy hatékonyan kezeljen sok párhuzamos kérést anélkül, hogy minden kéréshez külön szálat hozna létre, ez pedig magas teljesítményt biztosít.