Middle+
Как работи цикълът на събитията (Event Loop) в Node.js?
sobes.tech AI
Отговор от AI
Event Loop — това е механизъм, който позволява на Node.js да изпълнява неблокиращи операции за входящи/изходящи операции, въпреки че JavaScript е еднопоточен език. Event Loop непрекъснато следи стека за извиквания, опашката за обратно повикване и различни опашки за събития (таймери, I/O).
Основните фази на Event Loop:
- timers: изпълнява планираните обратно повиквания с
setTimeout()иsetInterval(). - pending callbacks: изпълнява обратно повиквания на системни операции за вход/изход (например, мрежови грешки), отложени до следващата итерация на Event Loop.
- idle, prepare: вътрешни фази на Event Loop.
- poll:
- изчислява колко дълго да блокира и да проверява операциите за вход/изход.
- обработва събития в опашката за callback-и за I/O, когато техният брой достигне лимит или времето изтече.
- check: изпълнява обратно повиквания, планирани с
setImmediate(). - close callbacks: изпълнява callback-и за затваряне, например
socket.destroy().
process.nextTick() и микро задачи (обещания, queueMicrotask()) се изпълняват между фазите на Event Loop и преди преминаването към следващата фаза или завършването на текущата. 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 ефективно да обработва множество паралелни заявки без създаване на отделен поток за всяка, което осигурява висока производителност.