Node.js 事件循环:理解异步非阻塞 I/O
掌握 Node.js 事件循环机制,理解 setTimeout、setImmediate、process.nextTick 的执行顺序。 · 难度:入门 · +15XP
事件循环是什么?
事件循环是 Node.js 实现异步非阻塞 I/O 的核心机制。它允许 Node.js 在单线程中处理成千上万的并发连接,而不需要多线程开销。
事件循环阶段
事件循环按以下阶段顺序执行(简化):
- timers:执行 setTimeout / setInterval 回调
- pending callbacks:执行延迟到下一轮的 I/O 回调
- idle, prepare:内部使用
- poll:获取新 I/O 事件,执行 I/O 回调
- check:执行 setImmediate 回调
- close callbacks:执行 close 事件回调
关键 API 对比
| API | 阶段 | 特点 |
|---|---|---|
| process.nextTick | 当前阶段结束前 | 优先级最高,会打断事件循环 |
| setTimeout(fn, 0) | timers 阶段 | 最小延迟 1ms |
| setImmediate | check 阶段 | 在当前 poll 阶段后执行 |
代码示例
const fs = require('fs');
fs.readFile(__filename, () => {
setTimeout(() => console.log('setTimeout'));
setImmediate(() => console.log('setImmediate'));
process.nextTick(() => console.log('nextTick'));
});
// 输出顺序:nextTick -> setImmediate -> setTimeout练习提示
修改右侧代码,添加一个 process.nextTick 和一个 setImmediate 调用,观察它们的执行顺序。