在NodeJS中使用集群时无法使所有工作程序处于工作程序块中

时间:2019-03-13 10:35:46

标签: node.js node-cluster

我需要在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 ]

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)

Documentation about cluster

  

使用child_process.fork()方法生成工作进程


当分叉进程时,会创建一个新的进程,它是实际进程(variables ...)的严格副本。它们与每个过程变量之间没有关系。

新的进程将从调用fork()函数的行(代码)开始。

Definition of fork