worker_threads

Node.js 中让 JavaScript 在线程中并行执行的模块,用于 CPU 密集任务。

#type / concept #status / growing #resource / nodejs #resource / javascript

[!info] related notes

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 的对比

特性浏览器 WorkerNode worker_threads
目的不阻塞 UI不阻塞事件循环
限制不能操作 DOM可以访问大部分 Node API
通信postMessagepostMessage / SharedArrayBuffer

线程开销

  • 线程有创建开销,不适合频繁创建销毁
  • 通信有成本,数据需要序列化或拷贝
  • 共享内存(SharedArrayBuffer)可以减少拷贝,但要处理同步问题

最容易误解的点

  • worker_threads 不是”多线程编程”的银弹,有创建和通信成本
  • 不是所有任务都适合用 Worker,I/O 密集任务用异步就够
  • Worker 里不能直接操作主线程的变量,只能通过消息传递

它不是 libuv worker pool

这是一个非常高频的混淆点:

  • worker_threads 是你显式创建的 JavaScript 工作线程
  • libuv worker pool 是 Node.js 底层用来承接部分 fsdnscryptozlib 等阻塞任务的后台线程池

前者更偏业务层 CPU 并行,后者更偏运行时内部异步实现。

放回主题图里看

创建于 2026/3/19 更新于 2026/5/27