Open
Description
对于 Node 的事件循环,官网上的这篇文章介绍得非常详细,值得一读:The Node.js Event Loop, Timers, and process.nextTick()
事件循环六个阶段
分别是:
timers
pending callbacks
idle, prepare
poll
check
close callback
timer
阶段:主要就是执行 setTimeout,setImmedaite 的回调函数
pending callback
阶段:一些延迟到下个循环执行的 IO 回调,比如 TCP 连接错误要重连,相关回调会被调度至这个阶段执行
idle,prepare
: 仅供内部执行
poll
阶段:非常重要的阶段,所有 io 事件都会在这里被检索执行,Node 会适当在这里阻塞,这个阶段会做两件事:
- 计算需要阻塞多长时间来处理 io
- 执行 poll 队列里的事件,具体过程是:如果 poll 队列不为空,那么取出遍历执行所有事件回调,直到队列为空或者达到最大执行限制;如果 poll 队列为空了,那么会去看这个脚本是不是被 setImmedaite 调度执行的,如果是,立马结束 poll 阶段,转到 check 阶段去执行 setImmedaite 的回调;如果不是,那么就会等待回调被添加至消息队列,然后立即执行它。
此外,当 poll 队列为空时,还会去检查 timers 阶段设置的定时器到期了没,如果是的话会转去 timers 阶段执行定时器的回调。所以说,这个 poll 阶段是 Node 事件循环的核心。
check
阶段:前面说了,就是执行 setImmedaite 的回调
close callback
: 一些关闭操作,比如 socket 的连接断开处理。