# Node.js 事件循环
Node.js中的事件循环分为6个阶段
poll check close timer I/O idle,prepare
┌───────────────────────┐
┌─>│ timers │
│ └──────────┬────────────┘
│ ┌──────────┴────────────┐
│ │ I/O callbacks │
│ └──────────┬────────────┘
│ ┌──────────┴────────────┐
│ │ idle, prepare │
│ └──────────┬────────────┘ ┌───────────────┐
│ ┌──────────┴────────────┐ │ incoming: │
│ │ poll │<── connections ─── │
│ └──────────┬────────────┘ │ data, etc. │
│ ┌──────────┴────────────┐ └───────────────┘
│ │ check │
│ └──────────┬────────────┘
│ ┌──────────┴────────────┐
└──┤ close callbacks │
└───────────────────────┘
TIIPCC
timers timers 阶段会执行 setTimeout 和 setInterval
I/O callbacks
I/O阶段会执行除了close 事件,定时器和setImmediate的回调
idle, prepare 队列的移动,仅系统内部使用
poll poll 阶段很重要,这一阶段中,系统会做两件事情
1.执行到点的定时器 2.执行 poll 队列中的事件
并且当 poll 中没有定时器的情况下,会出现以下两件事情:
- 如果 poll 队列不为空,会遍历回调队列并同步执行,直到队列为空或者系统限制
- 如果 poll 队列为空,会有两件事发生
- 如果有 setImmediate 需要执行,poll 阶段会停止并且进入到 check 阶段执行 setImmediate
- 如果没有 setImmediate 需要执行,会等待回调被加入到队列中并立即执行回调
- 如果有别的定时器需要被执行,会回到 timer 阶段执行回调。
check check阶段执行setImmediate
close callbacks close callbacks 阶段执行 close 事件
# 参考
← Nodejs 事件 Node.js 进程 →