简介:worker_threads
worker_threads 模块允许我们创建功能齐全的多线程 Node.js 程序。thread worker 是在单独的线程中生成的一段代码(通常从文件中取出)。
注意,术语 thread worker,worker 和 thread 经常互换使用,他们都指的是同一件事。
要想使用 thread worker,必须导入
worker_threads 模块。让我们先写一个函数来帮助我们生成这些thread worker,然后再讨论它们的属性。
type WorkerCallback = (err: any, result?: any) => any;export function runWorker(path: string, cb: WorkerCallback, workerData: object | null = null) {
const worker = new Worker(path, { workerData });
worker.on('message', cb.bind(null, null));
worker.on('error', cb);
worker.on('exit', (exitCode) => {
if (exitCode === 0) {
return null;
}
return cb(new Error(`Worker has stopped with code ${exitCode}`));
});
return worker;
}
要创建一个 worker,首先必须创建一个
Worker 类的实例。它的第一个参数提供了包含 worker 的代码的文件的路径;第二个参数提供了一个名为
workerData 的包含一个属性的对象。这是我们希望线程在开始运行时可以访问的数据。请注意:不管你是用的是 JavaScript, 还是最终要转换为 JavaScript 的语言(例如,TypeScript),路径应该始终引用带有
.js 或
.mjs 扩展名的文件。我还想指出为什么使用回调方法,而不是返回在触发
message 事件时将解决的 promise。这是因为 worker 可以发送许多
message 事件,而不是一个。正如你在上面的例子中所看到的,线程间的通信是基于事件的,这意味着我们设置了 worker 在发送给定事件后调用的侦听器。
以下是最常见的事件:
worker.on('error', (error) => {});只要 worker 中有未捕获的异常,就会发出
error 事件。然后终止 worker,错误可以作为提供的回调中的第一个参数。
worker.on('exit', (exitCode) => {});在 worker 退出时会发出
exit 事件。如果在worker中调用了
process.exit(),那么
exitCode 将被提供给回调。如果 worker 以









