CodeRoadMap
首页路线题库资源库文章社区
CodeRoadMap

程序员的学习成长路线图。内容免费开放,登录后可同步路线图与课时进度。

由 程序员柏风 独立维护 · 关于作者

学习

  • 路线图
  • 课程
  • 面试题
  • 文章
  • 我

更多

  • 资源
  • 社区
  • 关于作者
  • 内容说明

© 2026 CodeRoadMap

津ICP备2026012044号-1·津公网安备12011002026155号·coderoadmap@126.com
Node.js 运行时进阶/课时/Worker Threads
RawBlame
课时目录12 节

Node.js 运行时进阶

  1. 01运行时进阶概览
  2. 02定时器与 nextTick
  3. 03回调与错误栈
  4. 04子进程
  5. 05Worker Threads
  6. 06Cluster 与多进程
  7. 07垃圾回收
  8. 08调试 Node
  9. 09APM 与生产监控
  10. 10CLI 工具链
  11. 11global 与内置模块
  12. 12综合练习

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。

与 Java 线程池对照

Worker ThreadsJava ExecutorService
模型每 Worker 一个 Loop + V8线程池 + 共享堆(需注意同步)
数据共享消息或 SAB共享对象需锁
典型用途离线程 CPU 计算通用并行

练习

  • 写 worker 计算斐波那契第 N 项(N=40),对比主线程阻塞时的 HTTP 延迟
  • 用 Transferable 传递大 ArrayBuffer,验证主线程侧 buffer 已 detached
  • 实现简单池:3 个 worker 排队消费 { id, payload } 任务

小结

Worker 解决 CPU 阻塞主 Loop;I/O 密集仍用 async。 下一课 Cluster——多进程绑定多核跑 HTTP 服务。

加载本节练习…
← 上一课子进程下一课 →Cluster 与多进程