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

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

相关推荐
朝朝暮暮an2 小时前
Node.js-第一天学习内容
node.js
lichenyang4534 小时前
Node.js AI 开发入门 - 完整学习笔记
人工智能·学习·node.js
岁岁种桃花儿4 小时前
NodeJs从入门到上天:什么是Node.js
前端·node.js
一心赚狗粮的宇叔1 天前
VScode常用扩展包&Node.js安装及npm包安装
vscode·npm·node.js·web
花间相见1 天前
【AI开发】—— Ubuntu系统使用nvm管理Node.js多版本,版本切换一键搞定(实操完整版)
linux·ubuntu·node.js
嘿是我呀1 天前
【用npm安装node时报错“npm 无法加载文件”】
前端·npm·node.js
西门吹-禅2 天前
prisma
node.js
怪兽毕设2 天前
基于SpringBoot的选课调查系统
java·vue.js·spring boot·后端·node.js·选课调查系统
心.c2 天前
Vue3+Node.js实现文件上传分片上传和断点续传【详细教程】
前端·javascript·vue.js·算法·node.js·哈希算法
roamingcode2 天前
我是如何 Vibe Coding,将 AI CLI 工具从 Node.js 迁移到 Rust 并成功发布的
人工智能·rust·node.js·github·claude·github copilot