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',()=.{})

我的问题是:

  1. pending callbacks阶段执行的回调 和 poll 阶段执行的回调有什么不一样吗?
  2. 有很多文章是这样写的他们的叙述是否和官方的有出入

回答

阶段流程概述

  • 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

回到顶部