在收到来自单个工人的消息后向所有工人发送消息

Sending all workers message after receiving message from a single worker

我试图让我的主人在工人之间分配工作,它唯一做的就是在收到其中一名工人的消息后向所有工人发送消息。

我已经尝试将 worker.send 包含在 worker.on 函数中,如下所示。出于某种原因,它将打印每个工人自己的 id 'text to' 后跟相同的 id,但不会打印任何其他组合。 (例如“0 文本到 3”)

const cluster = require('cluster')
const numCPUs = require('os').cpus().length

if (cluster.isMaster) {
    for (let i = 0; i < numCPUs; i++) {
        const worker = cluster.fork({id: i})
        worker.on('message', text => {
            worker.send(text)
        })
    }
}
else {
    const id = Number(process.env.id)
    let messagesReceived = 0
    process.send(id)
    process.on('message', text => {
        console.log(text, 'text to', id)
        messagesReceived++
    })
    if (messagesReceived >= numCPUs) process.exit()
}

本质上,在示例中,我希望每个工人能够将自己的 ID 发送给主人,并让主人将消息发送给所有工人。每个工人应该打印数字 'text to' 数字的每个组合。数字上升到有多少工人。

您的主进程仅在将其初始消息发送给主进程后才将消息发送回工作进程。如果您想向所有工作人员广播一条消息,那么您需要维护一个工作人员数组并循环发送给他们。

const cluster = require('cluster')
const numCPUs = require('os').cpus().length

if (cluster.isMaster) {
    masterLogic();
} else {
    workerLogic();
}

async function masterLogic() {
    const workers = await Promise.all(
      [...Array(numCPUs).keys()].map(i => spawnWorker(i));
    );

    for (let i = 0; i < numCPUs; i++) {
        workers.forEach(worker => worker.send(`Message #${i}`));
    }  
}

function spawnWorker(i) {
    return new Promise(resolve => {
        const worker = cluster.fork({ id: i })
        worker.on('message', text => {
           resolve(worker); 
        });
    });
}

function workerLogic() {
    const id = Number(process.env.id)
    let messagesReceived = 0
    process.send(id)
    process.on('message', text => {
        console.log(text, 'text to', id)
        messagesReceived++
    })
    if (messagesReceived >= numCPUs) process.exit()  
}