⚡ 编程实验室🏗️ HTML🎨 CSS⚡ JavaScript🐍 Python🗄️ SQL☕ Java⚛️ React💚 Vue🟢 Node.js⚙️ C语言🐘 PHP🐹 Go🔷 TypeScript🐬 MySQL🔧 C++🎯 C#🦀 Rust🅱️ Bootstrap💡 jQuery🎸 Django🍃 MongoDB👗 Sass🎪 Kotlin📊 R语言📋 XML📊 Excel🐘 PostgreSQL🐳 Docker🅰️ Angular🎮 游戏🏠 网站首页

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 同时计算不同数值,对比总耗时。

Ctrl+Enter
🚀 升级VIP
解锁全部课程+AI助手

🏆 学习排行

加载中...

📊 统计

📖 135 篇
0 完成
🔥 0