Node.js Worker 线程:多线程并行计算
使用 worker_threads 模块创建独立线程,实现 CPU 密集型任务的并行处理。 · 难度:入门 · +15XP
为什么需要 Worker 线程?
Node.js 主线程是单线程的,当执行 CPU 密集型任务(如大量计算、图像处理、JSON 解析)时会阻塞事件循环。Worker 线程允许你在独立线程中运行 JavaScript 代码,与主线程通过消息传递通信。
主线程创建 Worker
// main.js
const { Worker } = require('worker_threads');
function runWorker(workerData) {
return new Promise((resolve, reject) => {
const worker = new Worker('./worker.js', { workerData });
worker.on('message', resolve);
worker.on('error', reject);
worker.on('exit', (code) => {
if (code !== 0) reject(new Error(Worker 退出码 ${code}));
});
});
}
async function main() {
const result = await runWorker(42);
console.log('Worker 返回:', result);
}
main();
Worker 线程代码
// worker.js
const { parentPort, workerData } = require('worker_threads');
// 执行耗时计算
function fibonacci(n) {
return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2);
}
const result = fibonacci(workerData);
parentPort.postMessage(result);
共享内存 (SharedArrayBuffer)
对于大数据,可以使用 SharedArrayBuffer 在线程间共享内存,避免序列化开销。
const { Worker } = require('worker_threads');
const sharedBuffer = new SharedArrayBuffer(4);
const view = new Int32Array(sharedBuffer);
view[0] = 0;
const worker = new Worker('./shared-worker.js', { workerData: sharedBuffer });
// 等待 worker 修改
setTimeout(() => {
console.log('共享值:', view[0]); // 可能已更新
}, 100);
练习提示
右侧代码模拟了一个计算斐波那契数列的 Worker。尝试修改 workerData 为 45 并观察主线程是否被阻塞。然后创建多个 Worker 同时计算不同数值,对比总耗时。