[译] Nodejs 详解:事件循环(翻译自 Node.js 官网文档)
[译] 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 的事件循环分为六个阶段:
- Timers 阶段:执行
setTimeout
和setInterval
回调。 - I/O Callbacks 阶段:处理一些上一轮未完成的 I/O 回调。
- Idle, Prepare 阶段:仅供 Node.js 内部使用。
- Poll 阶段:获取新的 I/O 事件;执行与 I/O 相关的回调。如果队列为空,会阻塞在这里等待新的事件,直到达到系统限制(如
setTimeout
设置的 1ms)。 - Check 阶段:执行
setImmediate
回调。 - Close Callbacks 阶段:执行一些关闭的回调函数,如
socket.on('close', ...)
。
以下是一个简单的示例,展示 setTimeout
和 setImmediate
的执行顺序:
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 的事件循环。