Node.js 事件循环

nodejs/event_loop2026-10-22 12:14:53

Node.js 的事件循环是其异步编程模型的核心。它允许 Node.js 处理大量的并发操作,而不会阻塞线程。以下是对 Node.js 事件循环的详细说明:

事件循环的执行顺序

特殊的回调队列

  1. process.nextTick:

    • process.nextTick 回调会在当前操作完成后立即执行,而不等待进入下一个事件循环阶段。
    • 它优先于其他所有的回调。
  2. 微任务队列(Microtask Queue):

    • 包括 Promise 的回调和 process.nextTick。
    • 在每个阶段结束后,事件循环会检查微任务队列,并执行所有的微任务。

事件循环的阶段

  1. 定时器阶段(Timers):

    • 处理 setTimeout 和 setInterval 的回调。
    • 这些回调会在指定的时间到达后尽快执行。
  2. 待定回调阶段(Pending Callbacks):

    • 处理一些系统操作的回调,例如 TCP 错误类型的回调。
    • 这些回调通常是由操作系统触发的。
  3. 闲置、准备阶段(Idle, Prepare):

    • 仅供内部使用。
    • Node.js 在这里执行一些内部操作。
  4. 轮询阶段(Poll):

    • 检索新的 I/O 事件;执行与 I/O 相关的回调(几乎所有的回调都在这个阶段执行),除非有定时器设置。
    • 如果没有定时器设置,事件循环会在这个阶段停留,等待新的 I/O 事件。
  5. 检查阶段(Check):

    • 执行 setImmediate 回调。
    • setImmediate 回调会在轮询阶段之后立即执行。
  6. 关闭回调阶段(Close Callbacks):

    • 执行一些关闭的回调,如 socket.on('close', ...)。

示例

以下是事件循环的执行顺序示例:

console.log('Start');

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

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

process.nextTick(() => {
  console.log('Next Tick callback');
});

Promise.resolve().then(() => {
  console.log('Promise callback');
});

console.log('End');
  1. 同步代码:console.log('Start') 和 console.log('End') 立即执行。
  2. process.nextTick:process.nextTick 回调在当前操作完成后立即执行。
  3. 微任务队列:Promise 回调在当前操作完成后立即执行,但在 process.nextTick 之后。
  4. setImmediate:setImmediate 回调在检查阶段执行。
  5. setTimeout:setTimeout 回调在定时器阶段执行。

实际输出:

Start
End
Next Tick callback
Promise callback
Immediate callback
Timeout callback

本页目录