Middle+
როგორ მუშაობს მოვლენის ციკლი (Event Loop) Node.js-ში?
sobes.tech AI
პასუხი AI-სგან
Event Loop — ეს არის მექანიზმი, რომელიც საშუალებას აძლევს Node.js-ს განახორციელოს ბლოკირებადი არაეთერეული I/O ოპერაციები, მიუხედავად იმისა, რომ JavaScript არის ერთწრიანი ენა. Event Loop უწყვეტად აკვირდება ზარის სტეკს, კოლბეკების რიგს და სხვადასხვა მოვლენის რიგებს (ტაიმერები, I/O).
Event Loop-ის ძირითადი ფაზები:
- timers: ახორციელებს
setTimeout()დაsetInterval()დაგეგმილ კოლბეკებს. - pending callbacks: ახორციელებს სისტემის ოპერაციების (მაგალითად, ქსელური შეცდომების) კოლბეკებს, რომლებიც გადადებულია შემდეგი Event Loop-ის იტერაციამდე.
- idle, prepare: Event Loop-ის შიდა ფაზები.
- poll:
- აფასებს, რამდენ ხანს უნდა იყოს ბლოკირებული და როგორ უნდა გამოიძახოს I/O ოპერაციები.
- ახორციელებს I/O კოლბეკების რიგში მოვლენებს, როდესაც მათი რაოდენობა აღწევს გარკვეულ ზღვარს ან დრო ამოიწურა.
- check: ახორციელებს დაგეგმილ
setImmediate()კოლბეკებს. - 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-ს ეფექტურად მართოს მრავალი პარალელური მოთხოვნა, ყოველ მათგანს ცალკე ნაკადი შექმნის გარეშე, რაც უზრუნველყოფს მაღალი პროდუქტიულობა.