Node.js 进程与线程概念
理解进程与线程是 Node.js 并发编程的基础。
进程
定义
进程是操作系统分配资源的基本单位,拥有独立的内存空间。
特性
| 特性 | 说明 |
|---|---|
| 内存空间 | 独立,互不干扰 |
| 资源分配 | 文件描述符、端口等 |
| 创建开销 | 较大 |
| 通信方式 | IPC(进程间通信) |
Node.js 进程
JavaScript
// 获取进程信息
console.log('进程ID:', process.pid);
console.log('进程标题:', process.title);
console.log('平台:', process.platform);
console.log('架构:', process.arch);
console.log('Node版本:', process.version);
console.log('内存使用:', process.memoryUsage());
console.log('CPU使用:', process.cpuUsage());
线程
定义
线程是 CPU 调度的基本单位,同一进程内的线程共享内存空间。
特性
| 特性 | 说明 |
|---|---|
| 内存空间 | 共享进程内存 |
| 创建开销 | 较小 |
| 通信方式 | 共享内存 |
| 调度 | 操作系统调度 |
Node.js 线程模型
JavaScript
// Node.js 主线程是单线程
// 但内部有线程池处理某些操作
// libuv 线程池默认 4 个线程
// 可通过 UV_THREADPOOL_SIZE 调整
process.env.UV_THREADPOOL_SIZE = 8;
进程与线程对比
| 对比项 | 进程 | 线程 |
|---|---|---|
| 资源 | 独立内存 | 共享内存 |
| 开销 | 创建成本高 | 创建成本低 |
| 安全性 | 进程隔离,安全 | 共享内存需同步 |
| 通信 | IPC 机制复杂 | 共享内存简单 |
| 崩溃影响 | 不影响其他进程 | 可能导致进程崩溃 |
Node.js 单线程特点
单线程优势
JavaScript
// 无锁竞争
// 无死锁风险
// 无线程切换开销
// 适合 I/O 密集型
const fs = require('fs');
fs.readFile('file.txt', (err, data) => {
// 异步回调,不阻塞
});
单线程劣势
JavaScript
// CPU 密集型会阻塞
function heavyCompute() {
let sum = 0;
for (let i = 0; i < 1e9; i++) {
sum += i; // 阻塞事件循环
}
return sum;
}
解决方案
多进程
JavaScript
// 使用 child_process 或 cluster
const { fork } = require('child_process');
const worker = fork('./worker.js');
多线程
JavaScript
// 使用 worker_threads
const { Worker } = require('worker_threads');
const worker = new Worker('./worker.js');
进程状态
JavaScript
// 进程生命周期
// 创建 → 运行 → 等待 → 终止
// 监听进程事件
process.on('exit', (code) => {
console.log('进程退出,代码:', code);
});
process.on('beforeExit', (code) => {
console.log('即将退出');
});
process.on('uncaughtException', (err) => {
console.error('未捕获异常:', err);
});
注意事项
- Node.js 主线程单线程,不适合 CPU 密集型
- I/O 操作由 libuv 线程池处理
- 多进程适合利用多核 CPU
- 多线程适合共享内存场景
要点总结
- 进程拥有独立内存,线程共享内存
- Node.js 主线程单线程,事件循环驱动
- CPU 密集型用多进程/多线程解决
process对象提供进程信息和控制- libuv 线程池处理异步 I/O
📝 发现内容有误?点击此处直接编辑