node 事件循环的各个阶段

image.png图片截取自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. 有很多文章是这样写的image.png他们的叙述是否和官方的有出入
阅读 264
评论
    1 个回答

    阶段流程概述

    • 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 事件循环机制详解

      撰写回答

      登录后参与交流、获取后续更新提醒

      相似问题
      推荐文章