使用工作线程分配任务
- 引入
worker_threads
模块:在Node.js中,通过 const { Worker } = require('worker_threads');
引入工作线程模块。
- 创建工作线程:
- 在主脚本中,使用
new Worker(filename, options)
创建一个新的工作线程,filename
是工作线程执行的JavaScript文件路径,options
可包含传递给工作线程的数据等。例如:
const { Worker } = require('worker_threads');
const worker = new Worker('./worker.js', {
workerData: { message: 'Hello from main thread' }
});
- 在工作线程脚本中接收任务:在工作线程对应的JavaScript文件(如
worker.js
)中,通过 const { parentPort, workerData } = require('worker_threads');
获取父线程传递的数据和通信端口。例如:
const { parentPort, workerData } = require('worker_threads');
parentPort.on('message', (task) => {
// 处理任务
const result = performTask(task);
parentPort.postMessage(result);
});
function performTask(task) {
// 具体任务逻辑
return task * 2;
}
传递数据的方式
- 通过
workerData
:在主脚本创建工作线程时,可通过 options.workerData
传递数据给工作线程。工作线程可通过 workerData
获取这些数据。
- 使用
postMessage
:主脚本和工作线程都可以通过 postMessage
方法向对方发送数据。主脚本通过 worker.postMessage(data)
发送数据给工作线程,工作线程通过 parentPort.postMessage(data)
发送数据给主脚本。
需要注意的要点
- 数据拷贝:传递的数据会被拷贝,而不是共享引用。这意味着对传递数据的修改不会影响到原始数据,除非进行显式通信和更新。
- 线程安全:工作线程是独立的执行环境,不存在全局变量共享导致的线程安全问题。但在传递数据时,要确保数据结构和操作的一致性。
- 错误处理:主脚本和工作线程都要做好错误处理。工作线程可通过
parentPort.on('error', (err) => {})
处理自身错误,主脚本可通过 worker.on('error', (err) => {})
处理工作线程抛出的错误。
- 资源消耗:创建过多工作线程会消耗系统资源,要根据任务数量和系统性能合理分配工作线程。