Отправка сообщения всем работникам после получения сообщения от одного работника - PullRequest
3 голосов
/ 30 октября 2019

Я пытаюсь, чтобы мой мастер распределял работу среди рабочих, и единственное, что он делает, это рассылает сообщения всем рабочим, как только он получил сообщение от одного из работников.

У меня естьпопытался включить worker.send внутри функции worker.on, как вы можете видеть ниже. По какой-то причине он будет печатать каждый рабочий идентификатор «text to», за которым следует тот же идентификатор, но не печатать другие комбинации. (напр. «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()
}

По сути, в этом примере я хочу, чтобы каждый работник мог отправлять свой собственный идентификатор мастеру, а мастеру - отправлять сообщение всемрабочие. Каждый работник должен напечатать каждую комбинацию числа «текст в» число. Числа растут, сколько рабочих.

1 Ответ

0 голосов
/ 31 октября 2019

Ваш главный процесс отправляет сообщение обратно работнику только после того, как он отправил свое первоначальное сообщение мастеру. Если вы хотите передать сообщение всем работникам, вам нужно будет поддерживать массив работников и отправлять их всем в цикле.

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