Node.js 确实支持多线程,但需要理解其实现方式和限制。以下是关于 Node.js 多线程的详细说明:
Node.js 默认使用单线程事件循环模型处理 JavaScript 代码,这是其核心设计特点。但这里的"单线程"指的是 JavaScript 执行线程,实际上 Node.js 底层是多线程的(如 I/O 操作使用线程池)。
Node.js v10.5.0 引入了 worker_threads
模块,提供了真正的多线程支持:
const { Worker, isMainThread } = require('worker_threads');
if (isMainThread) {
// 主线程
const worker = new Worker(__filename, {
workerData: '一些数据'
});
worker.on('message', (msg) => console.log(msg));
worker.on('error', (err) => console.error(err));
worker.on('exit', (code) => {
if (code !== 0) console.error(`Worker stopped with exit code ${code}`);
});
} else {
// 工作线程
const { workerData } = require('worker_threads');
require('parentPort').postMessage(`收到数据: ${workerData}`);
}
特点: - 每个 Worker 运行在独立的 V8 实例中 - 线程间通过消息传递通信(而非共享内存) - 适合 CPU 密集型任务
tiny-worker
、webworker-threads
const { Worker, isMainThread, parentPort } = require('worker_threads');
function fibonacci(n) {
return n < 1 ? 0 : n <= 2 ? 1 : fibonacci(n - 1) + fibonacci(n - 2);
}
if (isMainThread) {
console.log('主线程');
const worker = new Worker(__filename);
worker.on('message', (result) => {
console.log(`斐波那契结果: ${result}`);
});
worker.postMessage(40); // 计算第40项
} else {
parentPort.on('message', (n) => {
const result = fibonacci(n);
parentPort.postMessage(result);
});
}
总结:Node.js 通过 Worker Threads 支持多线程,适合 CPU 密集型任务,但对于大多数 I/O 密集型应用,传统的异步模型仍然是更高效的选择。