Node.js 中的事件循环机制
概念
- “事件循环机制” 是浏览器或 Node.js 对于主线程的调度方式,主线程寻找任务并执行的过程就是事件循环。
Node.js 的事件循环
-
事件循环的多个阶段:
- timer
- pending callbacks —— 对某些系统操作执行回调
- (idle) —— Node 内部使用
- (prepare) —— Node 内部使用
- poll (I/O)
- check
- close callbacks
-
4 个宏任务队列:
- Timers Queue
- I/O Queue
- Check Queue
- Close Callback Queue
-
2 个微任务队列:(顺序如下)
- Next Tick Queue:
process.nextTick(callback)
- Other micro task:Promise 等
- Next Tick Queue:
-
事件循环机制:
- v10-:每个宏任务队列结束后,去清空微任务队列。
- v11+:每个宏任务完成后,就去清空微任务队列。
微任务与宏任务
- 微任务常见情况有:
process.nextTick()
(Node 独有)、Promise、MutationObserver。 - 宏任务常见情况有:
setTimeout()
、setInterval()
、setImmediate()
(Node 独有)、requestAnimationFrame()
(浏览器独有)、I/O、UI 渲染 (浏览器独有) 等。
setImmediate()
与 setTimeout()
-
两者分别属于不同阶段:“check 阶段” 和 “timer 阶段”。
-
setTimeout()
的延时至少要有 1ms。进入事件循环后,如果超过 1ms,则会先执行setTimeout()
;如果未超过 1ms,则会跳过 timer 阶段,进入 check 阶段,先执行setImmediate()
。