-
事件循环是指node.js执行非阻塞IO操作
-
当node.js启动时会初始化event loop,每一个event loop都会包含如下顺序六个循环阶段:
- timer阶段:这个阶段执行setTimeout和setInteval的回调函数
- IO callback阶段:此阶段执行某些系统操作的回调
- idle, prepare阶段
- poll阶段:获取新的IO事件,例如操作读取文件等,适当的条件下node将阻塞在这里
- check阶段:执行setImmediate设定的callback
- close callback阶段:比如
socket.on(‘close’, callback)
的callback会在这个阶段执行;
-
poll队列详解:
- 如果poll队列不为空,event loop会遍历队列并同步执行回调
- 如果poll队列为空
- 如果有setImmediate的回调,则event loop将结束poll阶段进入check阶段执行check队列
- 如果没有setImmediate的回调,event loop将阻塞在该阶段等待回调被加入 poll 队列,并立即执行。
- 一旦poll队列为空,event loop将检查timers,如果有timers回调,则event loop将绕回timers阶段,并执行timer队列
-
随着代码执行,event loop终将进入 poll 阶段,在这个阶段等待 incoming connection, request 等等。但是,只要有被setImmediate()设定了回调,一旦 poll 阶段空闲,那么程序将结束 poll 阶段并进入 check 阶段,而不是继续等待 poll 事件们 (poll events)。
-
process.nextTick
不属于事件循环的任何一个阶段,它属于该阶段与下阶段之间的过渡, 即本阶段执行结束, 进入下一个阶段前, 所要执行的回调。有给人一种插队的感觉. -
微任务nextTick优先级比Promise高,微任务在每个阶段后执行
NODE.JS:node event loop( 事件循环)
最新推荐文章于 2024-05-03 00:30:00 发布