Worker Threads
worker-threads、CPU 密集任务。
35 分钟
Worker Threads
child_process 开独立进程;worker_threads 在同一进程内开 OS 线程,共享部分资源,适合 CPU 密集 且不想阻塞 Event Loop 的任务(加密、图像、大 JSON 解析)。
学习目标
- 创建 Worker 并传递任务与结果
- 理解
workerData与MessageChannel的传参限制 - 知道何时选 Worker 而非子进程或 cluster
最小 Worker 示例
main.js
import { Worker } from "node:worker_threads";
const worker = new Worker(new URL("./hash-worker.js", import.meta.url), {
workerData: { input: "hello" },
});
worker.on("message", (result) => {
console.log("hash:", result);
});
worker.on("error", (err) => {
console.error(err);
});
hash-worker.js
import { parentPort, workerData } from "node:worker_threads";
import { createHash } from "node:crypto";
const hash = createHash("sha256").update(workerData.input).digest("hex");
parentPort.postMessage(hash);
Worker 文件是 独立入口;不要与主线程共享可变全局对象。
传参与性能
- 结构化克隆:
postMessage复制对象(除 Transferable 如 ArrayBuffer)。 - Transferable:
postMessage(buf, [buf.buffer])零拷贝转移所有权。 - SharedArrayBuffer:多线程共享内存,需理解 Atomics(高级场景)。
避免每请求 new Worker——用 Worker 池(固定 N 个 worker 复用),否则线程创建开销抵消收益。
与 Event Loop 的关系
Worker 内 仍有 Event Loop,但 CPU 同步计算 在 worker 线程跑,不阻塞主线程 I/O。
主线程应继续处理 HTTP(node-http);重计算丢进 worker。
不适合 Worker:大量 async I/O(数据库、HTTP 客户端)——主线程 + 异步 I/O 已足够,多线程反而复杂。
错误与调试
worker.on("error", (err) => {
// 未捕获异常
});
worker.on("exit", (code) => {
if (code !== 0) console.error("worker stopped", code);
});
调试可对 worker 单独 --inspect(不同 debug port);见 nrt-debug。