📜  Node.js 事件循环(1)

📅  最后修改于: 2023-12-03 15:03:15.233000             🧑  作者: Mango

Node.js 事件循环

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时环境,它使用了事件驱动、非阻塞 I/O 模型,使得高效地构建可扩展的网络应用成为可能。在了解 Node.js 的事件循环之前,我们先来看一下什么是事件驱动和非阻塞 I/O。

事件驱动

事件驱动是指程序的执行流程是由事件触发的,而不是通过代码的线性执行。Node.js 使用了事件驱动编程,通过触发不同的事件来响应各种操作,如接收到请求、读取文件等。当一个事件被触发时,相关的代码(事件处理器)被执行。

非阻塞 I/O

非阻塞 I/O 是指在进行 I/O 操作时,程序不会等待 I/O 完成后再执行下一条指令,而是先将 I/O 操作发起,继续执行后续的指令。当 I/O 操作完成后,通过回调函数来处理完成后的结果。这样可以在 I/O 操作等待期间,让 CPU 一直处于工作状态,提高资源利用率。

事件循环概述

Node.js 事件循环是 Node.js 处理事件的机制。在 Node.js 中,事件循环是指 Node.js 执行的主线程在等待和处理事件的过程。

Node.js 的事件循环基于一个称为事件队列的数据结构,用于保存事件和回调函数。事件循环会不断地从事件队列中取出事件,并执行相应的回调函数。

事件循环的阶段

Node.js 的事件循环由一些不同的阶段组成,每个阶段执行特定类型的操作。以下是 Node.js 事件循环的主要阶段:

  1. Timers(定时器阶段):执行 setTimeout()setInterval() 的回调函数。
  2. Pending callbacks(待定回调阶段):执行由上一轮循环延迟到当前循环的 I/O 回调函数。
  3. Idle, prepare(空闲、准备阶段):仅在内部使用,与 Node.js 的核心技术相关。
  4. Poll(轮询阶段):等待新的 I/O 事件,执行与 I/O 相关的回调函数(除了 close 事件,其余均属于此阶段)。
  5. Check(检测阶段):执行 setImmediate() 的回调函数。
  6. Close callbacks(关闭回调阶段):执行 socket.on('close', ...) 等关闭回调函数。

以上是 Node.js 事件循环的主要阶段。每当事件循环进入一个新的阶段时,Node.js 会执行该阶段的相关操作,然后检查是否有触发的事件,并执行对应的事件回调函数。

事件循环的过程

Node.js 事件循环的过程如下:

  1. 执行任何在代码中同步的操作。
  2. 执行当前事件循环阶段的操作,直到队列为空或达到系统限制。
  3. 如果事件队列为空,检查是否有已被 setImmediate() 提交的回调函数需要执行,如果有,则执行它们。
  4. 等待新的事件被触发,然后返回第 2 步。
总结

Node.js 的事件循环是实现异步非阻塞的核心机制,它通过事件驱动和非阻塞 I/O 提供了高效处理并发的能力。了解事件循环的阶段和过程,对于编写高效的 Node.js 程序至关重要。

参考文档: Node.js Events