Node.js 多线程完全指南总结

2020-06-17 06:09:52易采站长站整理

简介:worker_threads

worker_threads
模块允许我们创建功能齐全的多线程 Node.js 程序。

thread worker 是在单独的线程中生成的一段代码(通常从文件中取出)。

注意,术语 thread workerworkerthread 经常互换使用,他们都指的是同一件事。

要想使用 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 以