worker_threads
Node.js 中让 JavaScript 在线程中并行执行的模块,用于 CPU 密集任务。
#type / concept
#status / growing
#resource / nodejs
#resource / javascript
[!info] related notes
- 所属 MOC: nodejs-moc
- 相关概念: js-event-loop, browser-web-workers, libuv, libuv 事件循环与 Worker Pool
- 对比: javascript中的进程线程协程
worker_threads
Node.js 中让 JavaScript 在线程中并行执行的模块。
一句话定义
node:worker_threads 允许把 CPU 密集任务放到后台线程,不阻塞主线程的事件循环。
为什么需要它
Node.js 的 JavaScript 执行主线程是单线程的,遇到大量计算会阻塞所有请求。worker_threads 解决这个问题。
适用场景:
- 大数据计算
- 图像处理
- 加密解密
- 视频转码
- 文本解析
核心用法
主线程
import { Worker } from 'node:worker_threads';
const worker = new Worker('./worker.js');
worker.on('message', (result) => {
console.log('计算结果:', result);
});
worker.postMessage({ n: 1000000 });
worker.js
import { parentPort } from 'node:worker_threads';
parentPort.on('message', (data) => {
let sum = 0;
for (let i = 0; i < data.n; i++) sum += i;
parentPort.postMessage(sum);
});
核心概念
| 概念 | 说明 |
|---|---|
Worker | 创建新线程 |
parentPort | 子线程中与主线程通信的端口 |
workerData | 创建时传入的初始化数据 |
MessageChannel | 线程间双向通信 |
和浏览器 Worker 的对比
| 特性 | 浏览器 Worker | Node worker_threads |
|---|---|---|
| 目的 | 不阻塞 UI | 不阻塞事件循环 |
| 限制 | 不能操作 DOM | 可以访问大部分 Node API |
| 通信 | postMessage | postMessage / SharedArrayBuffer |
线程开销
- 线程有创建开销,不适合频繁创建销毁
- 通信有成本,数据需要序列化或拷贝
- 共享内存(SharedArrayBuffer)可以减少拷贝,但要处理同步问题
最容易误解的点
- worker_threads 不是”多线程编程”的银弹,有创建和通信成本
- 不是所有任务都适合用 Worker,I/O 密集任务用异步就够
- Worker 里不能直接操作主线程的变量,只能通过消息传递
它不是 libuv worker pool
这是一个非常高频的混淆点:
worker_threads是你显式创建的 JavaScript 工作线程- libuv worker pool 是 Node.js 底层用来承接部分
fs、dns、crypto、zlib等阻塞任务的后台线程池
前者更偏业务层 CPU 并行,后者更偏运行时内部异步实现。
放回主题图里看
- 事件循环原理:js-event-loop
- 浏览器 Worker 对比:browser-web-workers
- 进程与线程:javascript中的进程线程协程