系统解析 Node.js Event Loop 的执行流程,包括宏任务、微任务、libuv 线程池以及异步模型的底层机制。
Node.js 的核心能力是“非阻塞 I/O”,而实现这一能力的关键就是 Event Loop。
理解 Event Loop,意味着你真正理解了 Node.js 的运行机制。
严格来说:
JavaScript 是单线程的,但 Node.js 不是完全单线程。
Node.js 由以下部分组成:
Event Loop 主要分为几个阶段:
┌───────────────────────┐
│ timers(setTimeout) │
├───────────────────────┤
│ pending callbacks │
├───────────────────────┤
│ idle, prepare │
├───────────────────────┤
│ poll(I/O) │
├───────────────────────┤
│ check(setImmediate) │
├───────────────────────┤
│ close callbacks │
└───────────────────────┘
包括:
包括:
Node.js 执行顺序核心规则:
每执行完一个阶段,就会清空微任务队列
优先级如下:
process.nextTick > Promise.then > I/O callbacks > timers
console.log('start') setTimeout(() => { console.log('timeout') }, 0) Promise.resolve().then(() => { console.log('promise') }) process.nextTick(() => { console.log('nextTick') }) console.log('end')
输出结果:
start
end
nextTick
promise
timeout
Node.js 的 I/O 操作并不是 JS 线程完成的,而是交给 libuv 线程池:
默认线程数:
4 个线程
可以通过环境变量修改:
UV_THREADPOOL_SIZE=8
poll 阶段负责:
setTimeout(() => console.log('timeout'), 0) setImmediate(() => console.log('immediate'))
输出顺序不固定,取决于当前阶段。
process.nextTick(() => console.log('nextTick')) Promise.resolve().then(() => console.log('promise'))
输出:
nextTick
promise
I/O 完成后,会先执行 nextTick,再执行 Promise。
核心原因:
Event Loop 是 Node.js 的灵魂。
理解它,你就理解了:
这是后端与前端工程师的分水岭知识。
暂无评论,留下第一条声音吧。