Skip to content

Node.js Worker Threads(多线程)

cluster 是多进程(各自独立内存),worker_threads 是真正的多线程(共享内存),适合 CPU 密集计算。

cluster vs worker_threads

ClusterWorker 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 序列化
大量计算(斐波那契、素数等)网络请求
数据压缩/解压定时器操作