Node.js的事件循环是基于libuv库实现的,整个循环过程被划分为多个不同的阶段,每个阶段都有明确的职责。preparation阶段是事件循环中timers阶段之后的第二个阶段,属于libuv内部的处理环节,主要负责为后续的轮询阶段做前置准备。

preparation阶段的核心职责
preparation阶段的工作内容相对固定,主要围绕系统层面的预备任务展开,具体包含以下几个部分:
- 检查是否有待处理的信号事件,比如进程接收到的SIGINT、SIGTERM等系统信号,会在这个阶段被初步处理
- 为即将到来的轮询阶段准备必要的资源,比如检查是否有需要监听的文件描述符,提前做好相关的状态标记
- 处理一些和事件循环本身相关的内部状态更新,确保后续阶段的执行环境是正确的
preparation阶段和其他阶段的关系
要理解preparation阶段的作用,需要结合整个事件循环的执行顺序来看,Node.js事件循环的典型阶段顺序如下:
| 阶段名称 | 主要职责 |
|---|---|
| timers | 执行setTimeout、setInterval设定的到期回调 |
| preparation | 为轮询阶段做前置准备 |
| poll | 检索新的I/O事件,执行相关回调 |
| check | 执行setImmediate设定的回调 |
| close callbacks | 执行关闭事件的回调,比如socket.on('close', ...) |
可以看到preparation阶段处于timers和poll之间,它的准备工作直接决定了poll阶段能否顺利执行对应的I/O回调。
代码示例验证阶段执行顺序
我们可以通过简单的代码来验证preparation阶段在timers之后执行,这里借助setTimeout和setImmediate的执行顺序来侧面体现:
// 验证事件循环阶段顺序的示例代码
setTimeout(() => {
console.log('timers阶段:setTimeout回调执行');
}, 0);
setImmediate(() => {
console.log('check阶段:setImmediate回调执行');
});
// 多次执行这段代码会发现,setTimeout和setImmediate的输出顺序可能不同
// 这是因为timers阶段的执行时间受系统性能影响,但preparation阶段一定在timers之后、check之前执行需要注意的点
preparation阶段是libuv的内部实现环节,Node.js的官方文档中并没有直接暴露相关的API给开发者使用,因此日常开发中很少需要直接操作这个阶段。但了解它的作用可以帮助我们理解一些特殊的执行时序问题:
- 如果timers阶段有大量回调执行,会延长preparation阶段的开始时间,进而影响后续poll阶段的执行
- preparation阶段处理的信号事件优先级较高,可能会打断正常的回调执行流程
总的来说,preparation阶段是Node.js事件循环中承上启下的环节,虽然开发者不需要直接干预它的工作,但理解它的职责能帮助我们更深入掌握Node.js的异步执行机制。
Node.js事件循环preparation阶段libuv异步编程修改时间:2026-06-05 02:46:57