首页 > 解决方案 > 在 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 ]

标签: node.jsnode-cluster

解决方案


那是因为您的代码从一开始就执行了 3 次,所以每个变量对于每个工作人员来说都是唯一的。想一想正在运行 3 个不同的应用程序,它们彼此不共享变量。

worker 上的变量与aworker1中的变量不同。a2

如果你想共享信息,你可以使用数据库、持久存储,或者尝试在主从之间创建一个通信通道。

这是一个在主从之间进行通信的示例:

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

当然,您可以改进此代码,这只是示例。


推荐阅读