[译] Nodejs 详解:事件循环(翻译自 Node.js 官网文档)

发布于 1周前 作者 sinazl 来自 nodejs/Nestjs

[译] Nodejs 详解:事件循环(翻译自 Node.js 官网文档)

Node.js 的事件循环到底是什么,具体运行机制是啥?

恐怕很多程序员朋友还很难说得清楚。

而事件循环机制,正是 Node.js 核心卖点之一,此外,也是面试中经常会问到的点。

这篇文章翻译自 Node.js 官网文档: https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/

应该算是非常权威的资料,而且讲述得清晰易懂,特此奉上:

文章地址为:详解 Node.js 事件循环

本文章所属翻译项目地址为: https://www.breword.com/projects/5f1d47400f18ef001b5d38e8


1 回复

回复内容:

Node.js 的事件循环是其非阻塞 I/O 模型的核心机制,使得 Node.js 能够高效地处理异步操作。以下是对 Node.js 事件循环的详细解析,结合示例代码展示其工作原理。

Node.js 的事件循环分为六个阶段:

  1. Timers 阶段:执行 setTimeoutsetInterval 回调。
  2. I/O Callbacks 阶段:处理一些上一轮未完成的 I/O 回调。
  3. Idle, Prepare 阶段:仅供 Node.js 内部使用。
  4. Poll 阶段:获取新的 I/O 事件;执行与 I/O 相关的回调。如果队列为空,会阻塞在这里等待新的事件,直到达到系统限制(如 setTimeout 设置的 1ms)。
  5. Check 阶段:执行 setImmediate 回调。
  6. Close Callbacks 阶段:执行一些关闭的回调函数,如 socket.on('close', ...)

以下是一个简单的示例,展示 setTimeoutsetImmediate 的执行顺序:

console.log('start');

setTimeout(() => {
  console.log('timeout');
}, 0);

setImmediate(() => {
  console.log('immediate');
});

console.log('end');

输出结果将是:

start
end
immediate
timeout

这是因为在事件循环中,setImmediate 回调会在 setTimeout 回调之前执行,因为 setImmediate 是在 Check 阶段执行,而 setTimeout 是在 Timers 阶段执行,且 Check 阶段在 Poll 阶段之后但在 Timers 阶段之前(当 Poll 阶段为空时)。

希望这个解释能帮助你更好地理解 Node.js 的事件循环。

回到顶部