#node.js #node-cluster
#node.js #узел-кластер
Вопрос:
Мне нужно получить список идентификаторов всех работников в рабочем блоке. Вот мой пример, который не работает
const cluster = require('cluster');
var a = [];
if (cluster.isMaster) {
console.log('I am master');
cluster.fork();
cluster.fork();
} else if (cluster.isWorker) {
a.push(cluster.worker.id);
console.log(`I am worker #${cluster.worker.id}`);
console.log(a);
}
Вывод:
I am master
I am worker #1
[ 1 ]
I am worker #2
[ 2 ]
Ожидаемый результат
I am master
I am worker #1
[ 1 ]
I am worker #2
[ 1, 2 ]
Ответ №1:
Это потому, что ваш код выполняется три раза с самого начала, поэтому каждая переменная уникальна для каждого рабочего. Подумайте об этом примерно так, как будто запущены 3 разных приложения, они не разделяют переменную друг с другом.
Переменная a
на worker 1
отличается от переменной a
в worker 2
.
Если вы хотите поделиться информацией, вы можете либо использовать базу данных, постоянное хранилище, либо попытаться создать канал связи между ведущим устройством и подчиненными устройствами.
Вот пример взаимодействия между ведущим устройством и подчиненными устройствами:
const cluster = require('cluster');
var a = [];
function onNewWorker(workers) {
a = workers;
console.log(`I am worker #${cluster.worker.id}, all workers = ${a}`);
}
if (cluster.isMaster) {
cluster.on("fork", (worker) => {
a.push(worker);
a.forEach(w => w.send(a.map(wr => wr.id)));
});
console.log('I am master');
const proc1 = cluster.fork();
const proc2 = cluster.fork();
} else if (cluster.isWorker) {
a.push(cluster.worker.id);
process.on("message", onNewWorker);
console.log(`I am worker #${cluster.worker.id}`);
console.log(a);
}
Вывод
I am master
I am worker #1
I am worker #2
[ 1 ]
[ 2 ]
I am worker #1, all workers = 1
I am worker #1, all workers = 1,2
I am worker #2, all workers = 1,2
Конечно, вы можете улучшить этот код, это просто для примера.
Ответ №2:
Рабочие процессы создаются с использованием метода child_process.fork()
Когда вы разветвляете processus, создается новый processus, который является точной копией фактического processus (переменные …). Они не связаны между переменными каждого процесса.
Новый processus начнется со строки (кода), где fork()
была вызвана функция.