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 共享它。









