Skip to content

Node.js libuv

libuv 是 Node.js 的事件循环异步 I/O 核心引擎,用 C 语言编写,是 Node.js 跨平台高性能的关键。

libuv 的核心职责

 ┌─────────────────────────────────┐
 │          Node.js 应用层           │
 │   JavaScript (V8 引擎)           │
 ├─────────────────────────────────┤
 │          libuv                  │
 │  ┌────────────────────────────┐ │
 │  │    事件循环 (Event Loop)    │ │
 │  ├────────────────────────────┤ │
 │  │  线程池 (Thread Pool)       │ │
 │  │  默认 4 线程               │ │
 │  ├────────────────────────────┤ │
 │  │  跨平台抽象层                │ │
 │  │  epoll(Linux) / kqueue(macOS)│ │
 │  │  / IOCP(Windows)           │ │
 │  └────────────────────────────┘ │
 └─────────────────────────────────┘

事件循环 6 个阶段

   ┌───────────────────────────┐
┌─→│      timers               │  setTimeout / setInterval 回调
│  │  ─────────────────────    │
│  │  pending callbacks         │  系统操作回调
│  │  ─────────────────────    │
│  │  idle, prepare             │  内部使用
│  │  ─────────────────────    │
│  │  poll                      │  获取新的 I/O 事件
│  │  ─────────────────────    │
│  │  check                     │  setImmediate 回调
│  │  ─────────────────────    │
│  │  close callbacks           │  socket.on('close') 等
└──└───────────────────────────┘

关键概念

概念说明
事件循环单线程不停轮询,检查是否有待执行的异步回调
线程池默认 4 线程,处理 CPU 密集型 / 阻塞操作(fs、crypto、dns)
跨平台抽象Linux 用 epoll、macOS 用 kqueue、Windows 用 IOCP
非阻塞 I/O网络 I/O 直接用系统异步 API,不占用线程池

设置线程池大小

bash
# 环境变量设置
UV_THREADPOOL_SIZE=8 node app.js

microtask vs macrotask

类型示例优先级
microtaskprocess.nextTickPromise.then高(每个阶段结束都清空)
macrotasksetTimeoutsetImmediate、I/O低(按阶段执行)

process.nextTick > Promise.then > 其他微任务