从单个工作人员收到消息后发送所有工作人员消息

时间:2019-10-30 20:54:19

标签: javascript node.js cluster-computing

我正试图让我的主人在工人之间分配工作,唯一要做的就是一旦收到一个工人的信息,就向所有工人发送消息。

我尝试将worker.send包含在worker.on函数中,如下所示。出于某种原因,它将打印每个工作人员自己的ID“文本为”,后跟其相同的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发送给主服务器,并让主服务器将消息发送给所有工作人员。每个工作人员应打印数字“文本到”数字的每个组合。数字取决于有多少工人。

1 个答案:

答案 0 :(得分:0)

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

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()  
}