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.jsmicrotask vs macrotask
| 类型 | 示例 | 优先级 |
|---|---|---|
| microtask | process.nextTick、Promise.then | 高(每个阶段结束都清空) |
| macrotask | setTimeout、setImmediate、I/O | 低(按阶段执行) |
process.nextTick>Promise.then> 其他微任务