Node.js Worker Threads(多线程)
cluster 是多进程(各自独立内存),worker_threads 是真正的多线程(共享内存),适合 CPU 密集计算。
cluster vs worker_threads
| Cluster | Worker Threads | |
|---|---|---|
| 内存 | 独立(IPC 通信) | 共享 SharedArrayBuffer |
| 开销 | 较大(独立 V8) | 较小(共享 V8 实例) |
| 场景 | HTTP 服务多核利用 | CPU 密集计算 |
| 通信 | process.send() | postMessage + MessageChannel |
基础用法
js
// main.js — 主线程
import { Worker } from 'node:worker_threads'
const worker = new Worker('./worker.js', {
workerData: { value: 42 } // 传递初始数据
})
worker.on('message', (result) => console.log('结果:', result))
worker.on('error', (err) => console.error(err))
worker.on('exit', (code) => console.log('退出:', code))
// worker.js — 工作线程
import { parentPort, workerData } from 'node:worker_threads'
const result = heavyCalculation(workerData.value)
parentPort.postMessage(result)共享内存 (SharedArrayBuffer)
js
// main.js
import { Worker } from 'node:worker_threads'
const sharedBuffer = new SharedArrayBuffer(4)
const sharedArray = new Int32Array(sharedBuffer)
const worker1 = new Worker('./worker.js', { workerData: sharedBuffer })
const worker2 = new Worker('./worker.js', { workerData: sharedBuffer })
// worker.js
import { workerData } from 'node:worker_threads'
const shared = new Int32Array(workerData)
Atomics.add(shared, 0, 1) // 原子操作,不需要锁
Atomics.wait(shared, 0, 100) // 等待值变化
Atomics.notify(shared, 0, 1) // 唤醒等待线程线程池(复用 Worker)
js
// pool.js
import { Worker } from 'node:worker_threads'
class ThreadPool {
constructor(size) {
this.workers = Array.from({ length: size }, () => new Worker('./worker.js'))
this.queue = []
this.idle = [...this.workers]
}
async exec(data) {
return new Promise((resolve) => {
const worker = this.idle.pop() || this.queue[0]
const handler = (result) => {
worker.off('message', handler)
this.idle.push(worker)
resolve(result)
}
worker.on('message', handler)
worker.postMessage(data)
})
}
}
const pool = new ThreadPool(4) // 4 线程池
const results = await Promise.all([
pool.exec({ task: 1 }),
pool.exec({ task: 2 }),
pool.exec({ task: 3 }),
])Worker 适用场景
| 适合 | 不适合 |
|---|---|
| 图像/视频处理 | 简单 I/O(fs/net 天然异步) |
| 加密/解密 | 简单的 JSON 序列化 |
| 大量计算(斐波那契、素数等) | 网络请求 |
| 数据压缩/解压 | 定时器操作 |