node 事件循环的各个阶段
图片截取自https://nodejs.org/en/docs/gu...
timers
执行setTimeout setInterval的回调函数pending callbacks
执行延迟到下一个循环的I/O回调idle, prepare
内部调用poll
轮询新的I/O事件;执行I/O相关的回调(除seTimeout setInterval setImmediate 及连接关闭的回调如socket.on('close'),()=>{}),node在这个阶段会阻塞check
检查阶段,执行setImmediate的回调close callbacks
执行连接关闭的回调如socket.on('close',()=.{})
我的问题是:
- pending callbacks阶段执行的回调 和 poll 阶段执行的回调有什么不一样吗?
- 有很多文章是这样写的他们的叙述是否和官方的有出入
回答
阶段流程概述
- timers: 本阶段执行已经安排的 setTimeout() 和 setInterval() 的回调函数
- IO / callbacks: 执行 I/O 异常的回调,如TCP 连接遇到 ECONNREFUSED
- idle, prepare: 仅系统内部使用,只是表达空闲、预备状态(第2阶段结束,poll 未触发之前)
- poll: 检索新的 I/O 事件;执行与 I/O 相关的回调(几乎所有情况下,除了关闭的回调函数),node 将在此处阻塞。
- check: setImmediate() 回调函数在这里执行.
- close callbacks: 一些准备关闭的回调函数,如:socket.on('close', ...)
在每次运行的事件循环之间,Node.js 检查它是否在等待任何异步 I/O 或计时器,如果没有的话,则关闭干净。
pending callbacks
此阶段对某些系统操作(如 TCP 错误类型)执行回调。例如,如果 TCP 套接字在尝试连接时接收到 ECONNREFUSED,则某些 *nix 的系统希望等待报告错误。这将被排队以在 pending callbacks 阶段执行。
poll
轮询 阶段有两个重要的功能:
- 计算应该阻塞和 poll I/O 的时间。
- 然后,处理 poll 队列里的事件。
当事件循环进入 poll阶段且 timers scheduled,将发生以下两种情况之一:
- if the poll queue is not empty, 事件循环将循环访问其回调队列并同步执行它们,直到队列已用尽,或者达到了与系统相关的硬限制
If the poll queue is empty,还有两件事发生
- 如果脚本已按 setImmediate() 排定,则事件循环将结束 轮询 阶段,并继续 检查 阶段以执行这些计划脚本。
- 如果脚本尚未按 setImmediate()排定,则事件循环将等待回调添加到队列中,然后立即执行。
一旦 poll queue 为空,事件循环将检查 已达到时间阈值的timer计时器_。如果一个或多个计时器已准备就绪,则事件循环将回到 _timer 阶段以执行这些计时器的回调。
更多描述,看原文章:NodeJs 的 Event loop 事件循环机制详解
以上是 node 事件循环的各个阶段 的全部内容, 来源链接: utcz.com/a/34683.html