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

2020-06-17 06:09:52易采站长站整理
child_process
模块)来传输网络套接字。

创建通信渠道

线程之间的通信是通过 port 进行的,port 是

MessagePort
类的实例,并启用基于事件的通信。

使用 port 在线程之间进行通信的方法有两种。第一个是默认值,这个方法比较容易。在 worker 的代码中,我们从

worker_threads
模块导入一个名为
parentPort
的对象,并使用对象的
.postMessage()
方法将消息发送到父线程。

这是一个例子:


import { parentPort } from 'worker_threads';
const data = {
// ...
};

parentPort.postMessage(data);

parentPort
是 Node.js 在幕后创建的
MessagePort
实例,用于与父线程进行通信。这样就可以用
parentPort
worker
对象在线程之间进行通信。

线程间的第二种通信方式是创建一个

MessageChannel
并将其发送给 worker。以下代码是如何创建一个新的
MessagePort
并与我们的 worker 共享它:


import path from 'path';
import { Worker, MessageChannel } from 'worker_threads';

const worker = new Worker(path.join(__dirname, 'worker.js'));

const { port1, port2 } = new MessageChannel();

port1.on('message', (message) => {
console.log('message from worker:', message);
});

worker.postMessage({ port: port2 }, [port2]);

在创建

port1
port2
之后,我们在
port1
上设置事件监听器并将
port2
发送给 worker。我们必须将它包含在
transferList
中,以便将其传输给 worker 。

在 worker 内部:


import { parentPort, MessagePort } from 'worker_threads';

parentPort.on('message', (data) => {
const { port }: { port: MessagePort } = data;

port.postMessage('heres your message!');
});

这样,我们就能使用父线程发送的 port 了。

使用

parentPort
不一定是错误的方法,但最好用
MessageChannel
的实例创建一个新的
MessagePort
,然后与生成的 worker 共享它。