Sobes.tech
Middle+

როგორ მუშაობს მოვლენის ციკლი (Event Loop) Node.js-ში?

sobes.tech AI

პასუხი AI-სგან

Event Loop — ეს არის მექანიზმი, რომელიც საშუალებას აძლევს Node.js-ს განახორციელოს ბლოკირებადი არაეთერეული I/O ოპერაციები, მიუხედავად იმისა, რომ JavaScript არის ერთწრიანი ენა. Event Loop უწყვეტად აკვირდება ზარის სტეკს, კოლბეკების რიგს და სხვადასხვა მოვლენის რიგებს (ტაიმერები, I/O).

Event Loop-ის ძირითადი ფაზები:

  1. timers: ახორციელებს setTimeout() და setInterval() დაგეგმილ კოლბეკებს.
  2. pending callbacks: ახორციელებს სისტემის ოპერაციების (მაგალითად, ქსელური შეცდომების) კოლბეკებს, რომლებიც გადადებულია შემდეგი Event Loop-ის იტერაციამდე.
  3. idle, prepare: Event Loop-ის შიდა ფაზები.
  4. poll:
    • აფასებს, რამდენ ხანს უნდა იყოს ბლოკირებული და როგორ უნდა გამოიძახოს I/O ოპერაციები.
    • ახორციელებს I/O კოლბეკების რიგში მოვლენებს, როდესაც მათი რაოდენობა აღწევს გარკვეულ ზღვარს ან დრო ამოიწურა.
  5. check: ახორციელებს დაგეგმილ setImmediate() კოლბეკებს.
  6. close callbacks: ახორციელებს დახურვის კოლბეკებს, მაგალითად, socket.destroy().

process.nextTick() და მიკროტასკები (უადვლები, queueMicrotask()) შესრულდება ფაზებს შორის და შემდეგ ფაზაზე გადასვლამდე. process.nextTick() უფრო მაღალი პრიორიტეტით სარგებლობს, ვიდრე მიკროტასკები.

// დავალებების დაგეგმვის მაგალითები
console.log('დაწყება');

setTimeout(() => {
  console.log('ტაიმერი 0');
}, 0);

setImmediate(() => {
  console.log('setImmediate');
});

process.nextTick(() => {
  console.log('nextTick');
});

Promise.resolve().then(() => {
  console.log('Promise');
});

console.log('დასრულება');

// ტრადიციული შესრულების წესია (შესაძლოა განსხვავდებოდეს Node.js ვერსიიდან და დატვირთვიდან):
// დაწყება
// დასრულება
// nextTick
// Promise
// ტაიმერი 0  (timers ფაზაში)
// setImmediate (check ფაზაში)

Event Loop საშუალებას აძლევს Node.js-ს ეფექტურად მართოს მრავალი პარალელური მოთხოვნა, ყოველ მათგანს ცალკე ნაკადი შექმნის გარეშე, რაც უზრუნველყოფს მაღალი პროდუქტიულობა.