Sobes.tech
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:

  1. timers: täidab planeeritud setTimeout() ja setInterval() tagasihelisid.
  2. pending callbacks: täidab süsteemi operatsioonide (nt võrguvead) tagasihelisid, mis on edasi lükatud järgmise Event Loopi iteratsioonini.
  3. idle, prepare: Event Loopi sisemised faasid.
  4. 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.
  5. check: täidab planeeritud setImmediate() tagasihelisid.
  6. 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.