node.js - 如何在 Node.js 中的两个工作线程之间创建直接通信 channel

标签 node.js multithreading threadpool worker-thread

有没有办法在两个工作线程之间使用new MessageChannel创建直接通信 channel ?例如:我使用 worker_thread API 创建了一个主线程 P,它创建了两个工作线程 W1W2

P -> W1
  -> W2

我想直接启用 W1W2 之间的通信,而不是使用 parentPort 通过 P 进行通信。

最佳答案

使用new MessageChannel()生成双向通信 channel 。

index.js

const { Worker } = require('worker_threads');

const path = require('path'); 

const w1 = new Worker(path.join(__dirname,'./worker1.js'));
const w2 = new Worker(path.join(__dirname,'./worker2.js'));

w1.once('message', value => {
    w2.postMessage({
        port: value.port
    }, [value.port]);
});

w2.once('message', value => {
    w1.postMessage({
        port: value.port
    }, [value.port]);
});

worker1.js

const { MessageChannel, parentPort,  } = require('worker_threads');

let woker2Port;
console.log('worker1 started');

const { port1, port2 } = new MessageChannel();
port1.on('message', (value) => {
    console.log(value);
});

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

parentPort.on('message', value => {
    if (value.port) {
        woker2Port = value.port;
        woker2Port.postMessage({msg:'i am worker1!'});// send msg to worker2
        return;
    }
});

worker2.js

const { MessageChannel, parentPort,  } = require('worker_threads');

let woker1Port;
console.log('worker2 started');

const { port1, port2 } = new MessageChannel();
port1.on('message', (value) => {
    console.log(value);
});

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

parentPort.on('message', value => {
    if (value.port) {
        woker1Port = value.port;
        woker1Port.postMessage({msg:'i am worker2!'});// send msg to worker1
    }
});

注意:如果您在 VSCode 中调试此代码,您将不会在 worker1.jsworker2.js 中看到日志打印。 直接运行node index或者在ndb中调试它都可以正常工作!

关于node.js - 如何在 Node.js 中的两个工作线程之间创建直接通信 channel ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57898878/

相关文章:

javascript - 在 ES6 类中的函数之间共享变量

c++ - 子类化 std::thread:构造函数中可变参数模板函数的问题

java - 防止缓慢的作业接管线程池

javascript - 在客户端 (Angular) 和服务器 (NodeJs) 上共享对象定义

linux - Express.js 抛出错误 : ENOENT on linux server

node.js - 错误 : Cannot find module 'npm-registry-client'

android - 在线程android中使用处理程序

c# - 多线程应用程序冗余

c# - 如何知道线程池中的线程挂起/卡住

java - 为什么线程池只创建一个线程?