Node.js 事件循环的工作流程二

在每个tick的过程中,如何判断是否有事件需要处理

在 Node.js 的事件循环中,每个循环迭代称为一个 "tick"。在每个 tick 过程中,事件循环需要判断是否有事件需要处理。这个过程主要依赖于检查各个阶段的队列是否有待处理的回调函数。具体来说,事件循环会按照顺序依次检查各个阶段的回调队列,如果队列中有待处理的事件,则会处理这些事件。以下是详细的步骤:

  1. 检查 timers 阶段

    • 检查是否有任何计时器(setTimeoutsetInterval)的回调到期。如果有到期的计时器回调,则执行这些回调。
  2. 检查 I/O callbacks 阶段

    • 检查是否有任何延迟的 I/O 回调需要执行。执行这些回调。
  3. 进入 idle, prepare 阶段

    • 这个阶段是 Node.js 内部使用的,通常开发者不需要关注。
  4. 进入 poll 阶段

    • 在这个阶段,事件循环会检查是否有新的 I/O 事件需要处理。它会查看轮询队列,如果有事件则处理这些事件。如果没有到期的计时器,并且没有 setImmediate 需要执行,则事件循环可能会阻塞在这个阶段,等待新的 I/O 事件。
  5. 检查 check 阶段

    • 检查是否有任何 setImmediate 回调需要执行。如果有,则执行这些回调。
  6. 检查 close callbacks 阶段

    • 检查是否有任何关闭事件的回调需要执行,如 socket.on('close', ...)。执行这些回调。

每个阶段都有一个回调队列,事件循环通过检查这些队列来判断是否有事件需要处理。

判断是否有事件需要处理的细节

  1. Timers 阶段

    • 事件循环会检查是否有任何计时器的回调需要执行。它会查看每个计时器的到期时间,如果当前时间超过或等于计时器的到期时间,则将回调放入即将执行的队列中。
  2. I/O Callbacks 阶段

    • 事件循环会检查是否有任何 I/O 操作已经完成并且有回调需要执行。通常这些回调是在上一个轮询阶段检测到的完成的 I/O 操作。
  3. Poll 阶段

    • 事件循环会检查是否有任何 I/O 事件需要处理。在这个阶段,事件循环会处理新的 I/O 事件,并且会处理轮询队列中的回调。

    • 如果 poll 阶段有 I/O 回调需要执行,则会执行这些回调。

    • 如果 poll 阶段没有 I/O 回调,并且没有到期的计时器,事件循环可能会阻塞在这里等待新的 I/O 事件。

  4. Check 阶段

    • 事件循环会检查是否有任何 setImmediate 回调需要执行。如果有,则执行这些回调。
  5. Close Callbacks 阶段

    • 事件循环会检查是否有任何关闭事件的回调需要执行。如果有,则执行这些回调。

图解示意

以下是一个简化的流程图,展示事件循环在每个 tick 中如何判断是否有事件需要处理:

复制代码
sql复制代码       +-----------------------------------------+
       |         每个 tick 中的事件循环          |
       +-----------------------------------------+
                        |
                        v
          +----------------------------+
          | Timers 阶段                |
          | (执行到期的setTimeout等回调)|
          +----------------------------+
                        |
                        v
          +----------------------------+
          | I/O Callbacks 阶段         |
          | (执行延迟的I/O回调)        |
          +----------------------------+
                        |
                        v
          +----------------------------+
          | Poll 阶段                  |
          | (检索并执行新的I/O事件回调)|
          +----------------------------+
                        |
                        v
          +----------------------------+
          | Check 阶段                 |
          | (执行setImmediate回调)     |
          +----------------------------+
                        |
                        v
          +----------------------------+
          | Close Callbacks 阶段       |
          | (执行关闭事件的回调)       |
          +----------------------------+
                        |
                        v
        +---------------------------------------+
        | 进入下一个 tick,重复上述过程          |
        +---------------------------------------+

在每个阶段,事件循环都会检查是否有待处理的回调,如果有,则执行这些回调,并继续到下一个阶段。如果所有阶段都没有待处理的回调,事件循环会等待新事件的到来,然后继续循环

相关推荐
王蛋11112 小时前
前端工作问题或知识记录
前端·npm·node.js
Swift社区13 小时前
为什么 socket.io 客户端在浏览器能连上,但在 Node.js 中报错 transport close?
javascript·node.js
萌萌哒草头将军18 小时前
Node.js v24.8.0 新功能预览!🚀🚀🚀
前端·javascript·node.js
Adorable老犀牛19 小时前
可遇不可求的自动化运维工具 | 2 | 实施阶段一:基础准备
运维·git·vscode·python·node.js·自动化
若无_19 小时前
npm 与 pnpm 深度对比:从依赖管理到实际选型
npm·node.js
GISer_Jing19 小时前
Next系统学习(二)
前端·javascript·node.js
BillKu19 小时前
vue3 中 npm install mammoth 与 npm install --save mammoth 的主要区别说明
前端·npm·node.js
EndingCoder19 小时前
Electron 原生模块集成:使用 N-API
javascript·electron·node.js·桌面端
明远湖之鱼20 小时前
巧用 Puppeteer + Cheerio:批量生成高质量 Emoji 图片
前端·爬虫·node.js