我需要在worker块中获取所有worker 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 ]
答案 0 :(得分:2)
那是因为您的代码从一开始就执行了3次,因此每个变量对于每个工作程序都是唯一的。想想好像正在运行3个不同的应用程序,它们彼此之间没有共享变量。
工作程序a
上的变量1
与工作程序a
中的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
当然,您可以改进此代码,仅作为示例。
答案 1 :(得分:1)
使用child_process.fork()方法生成工作进程
当分叉进程时,会创建一个新的进程,它是实际进程(variables ...)的严格副本。它们与每个过程变量之间没有关系。
新的进程将从调用fork()
函数的行(代码)开始。