# 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 事件

# 参考

详细说明 Event loop (opens new window)

陕ICP备20004732号-3