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,重复上述过程          |
        +---------------------------------------+

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

相关推荐
爱分享的程序员3 小时前
前端面试专栏-算法篇:20. 贪心算法与动态规划入门
前端·javascript·node.js
我叫黑大帅9 小时前
Sequelize:让你和数据库唠嗑像聊微信一样简单 😎
后端·node.js
小山不高12 小时前
本地使用minio之前后端关键点
前端·node.js
吓死羊了12 小时前
设置nginx和tomcat开机自动启动
后端·node.js·tomcat
归于尽13 小时前
浏览器和 Node.js 的 EventLoop,原来差别这么大
前端·node.js·浏览器
前端双越老师14 小时前
30 行代码 langChain.js 开发你的第一个 Agent
人工智能·node.js·agent
浪裡遊1 天前
React Hooks全面解析:从基础到高级的实用指南
开发语言·前端·javascript·react.js·node.js·ecmascript·php
whale fall1 天前
npm install安装的node_modules是什么
前端·npm·node.js
会飞的鱼先生1 天前
Node.js-http模块
网络协议·http·node.js
用户3521802454751 天前
MCP极简入门:node+idea运行简单的MCP服务和MCP客户端
node.js·ai编程