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

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

相关推荐
weixin_5716674110 小时前
[解决] Node.js 安装后 命令找不到
node.js
孜孜不倦不忘初心12 小时前
mac安装nvm及问题记录
前端·node.js
快乐的哈士奇16 小时前
Gmail-邮件自动处理系统
node.js·自动化·excel
星空18 小时前
Node.js (Express) + Vue2 Axios 前后端交互 CRUD
vue.js·node.js·express
云浪19 小时前
别再让用户干等了:用 Express + SSE 实现《红楼梦》AI 问答实时输出
javascript·后端·node.js
怕浪猫19 小时前
Electron 开发实战(十四):实战项目|从零搭建轻量化桌面代码编辑器
前端·electron·node.js
zhuxiaojt1 天前
npx 为何如此之慢?浅谈 npx 速度慢的原因及工具推荐
node.js
码农刚子1 天前
从零开始:在 Windows 服务器上部署 Node.js 项目(小白实战教程)
后端·node.js
MageGojo2 天前
用 Node.js 把聚合 API 平台封装成零依赖命令行工具:registry 驱动的工程实践
node.js·restful·api接口·命令行工具·cli
濮水大叔2 天前
浅论CabloyJS全栈框架提供的“两级页签”机制
typescript·node.js·next.js