Middle+
Kuidas töötab sündmuste tsükkel (Event Loop) Node.js-is?
sobes.tech AI
Vastus AI-lt
Event Loop — see mehhanism võimaldab Node.js-l täita mittetõkestavaid I/O operatsioone, hoolimata sellest, et JavaScript on ühe lõngaga keel. Event Loop jälgib pidevalt kutsesideme virna, tagasihelide järjekorda ja erinevaid sündmuste järjekordi (aegajad, I/O).
Event Loopi põhifaasid:
- timers: täidab planeeritud
setTimeout()jasetInterval()tagasihelisid. - pending callbacks: täidab süsteemi operatsioonide (nt võrguvead) tagasihelisid, mis on edasi lükatud järgmise Event Loopi iteratsioonini.
- idle, prepare: Event Loopi sisemised faasid.
- poll:
- hindab, kui kaua tuleks blokeerida ja kuidas uurida I/O operatsioone.
- töötleb I/O tagasihelide järjekorra sündmusi, kui nende arv jõuab teatud piirini või aeg lõpeb.
- check: täidab planeeritud
setImmediate()tagasihelisid. - close callbacks: täidab sulgemise tagasihelisid, näiteks
socket.destroy().
process.nextTick() ja mikroülesanded (lubadused, queueMicrotask()) täidetakse faaside vahel ja enne järgmise faasi või praeguse faasi lõpetamist. process.nextTick() omab kõrgemat prioriteeti kui mikroülesanded.
// Ülesannete planeerimise näited
console.log('Algus');
setTimeout(() => {
console.log('Aegaja 0');
}, 0);
setImmediate(() => {
console.log('setImmediate');
});
process.nextTick(() => {
console.log('nextTick');
});
Promise.resolve().then(() => {
console.log('Lubadus');
});
console.log('Lõpp');
// Tüüpiline täitmise järjekord (võib varieeruda sõltuvalt Node.js versioonist ja koormusest):
// Algus
// Lõpp
// nextTick
// Promise
// Aegaja 0 (faasis timers)
// setImmediate (faasis check)
Event Loop võimaldab Node.js-l tõhusalt töödelda palju paralleelseid päringuid ilma igaüks eraldi niidi loomata, mis tagab kõrge jõudluse.