在 NodeJS 中使用集群时无法让所有工作人员进入工作块
Unable to get all workers in worker block while using cluster in NodeJS
我需要获取工作块中的所有工作人员 ID 列表。这是我的例子,它不起作用
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 ]
那是因为你的代码从一开始就执行了三次,所以每个变量对于每个worker都是唯一的。想想 3 个不同的应用程序 运行,它们彼此不共享变量。
worker 1
上的变量 a
与 worker 2
中的 a
变量不同。
如果你想共享信息,你可以使用数据库、持久存储,或者尝试在主从之间创建一个通信通道。
这里有一个主从之间通信的例子:
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
当然你可以改进这段代码,只是为了举例。
The worker processes are spawned using the child_process.fork() method
当您分叉一个进程时,将创建一个新进程,它是实际进程的严格副本 (变量 ...)。它们与每个过程变量之间没有关系。
新进程将从调用 fork()
函数的 (代码) 行开始。
我需要获取工作块中的所有工作人员 ID 列表。这是我的例子,它不起作用
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 ]
那是因为你的代码从一开始就执行了三次,所以每个变量对于每个worker都是唯一的。想想 3 个不同的应用程序 运行,它们彼此不共享变量。
worker 1
上的变量 a
与 worker 2
中的 a
变量不同。
如果你想共享信息,你可以使用数据库、持久存储,或者尝试在主从之间创建一个通信通道。
这里有一个主从之间通信的例子:
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
当然你可以改进这段代码,只是为了举例。
The worker processes are spawned using the child_process.fork() method
当您分叉一个进程时,将创建一个新进程,它是实际进程的严格副本 (变量 ...)。它们与每个过程变量之间没有关系。
新进程将从调用 fork()
函数的 (代码) 行开始。