node.js cluster 获取所有worker信息
node.js cluster get all workers info
根据 node.js 文档,集群 class 应该有一个 workers 对象,它可以像这样迭代:
Object.keys(cluster.workers).forEach((id) => {
cluster.workers[id].on('message', messageHandler);
});
但出于某种原因,当我在我的代码中尝试此操作时,cluster.workers 未定义(使用 pm2 启动的进程)
var cluster = require("cluster");
console.log("cluster status : " , cluster.isMaster ? " master " : " slave " , " - worker id " , (cluster.worker ? cluster.worker.id : " none ") , " workers : " , cluster.workers);
我得到这样的输出:
cluster status : slave - worker id 15 workers : undefined
cluster status : slave - worker id 14 workers : undefined
所以我猜 worker 只能从 master 获得,但是有没有办法为 slave 与其他 slave 通信?
没错,'workers' 属性 仅在主进程中可用(参见 latest documentation)。
我不认为 worker 可以通过任何方式直接相互通信 - 所有通信都通过 master。
您可以很容易地使用 'message' 机制来设置一个系统,使用 master 作为中继在 worker 之间路由消息。我不太确定您要实现的目标,但这是一个概述。
您发布的第一段代码的想法是您 运行 它在主控中,这意味着当主控从任何一个接收到消息时调用 "messageHandler" 回调它的工人。事实上,您可以通过以下方式实现相同的目的:
cluster.on('message', messageHandler);
向 messageHandler 函数传递了一个参数,用于标识发送消息的工作人员。
同样,worker 可以通过这样做来监听来自 master 的消息:
process.on('message', workerMessageHandler);
您可以通过以下方式发送消息:
// Worker: send message to master
process.send({ cmd: 'notifyRequest', data: 'somedata' });
// Master: send message to specific workers
worker.send({ data: 'somedata' });
cluster.workers[0].send({ whatever: 'something' });
消息可以是字符串或对象(将被序列化为JSON)。
根据 node.js 文档,集群 class 应该有一个 workers 对象,它可以像这样迭代:
Object.keys(cluster.workers).forEach((id) => {
cluster.workers[id].on('message', messageHandler);
});
但出于某种原因,当我在我的代码中尝试此操作时,cluster.workers 未定义(使用 pm2 启动的进程)
var cluster = require("cluster");
console.log("cluster status : " , cluster.isMaster ? " master " : " slave " , " - worker id " , (cluster.worker ? cluster.worker.id : " none ") , " workers : " , cluster.workers);
我得到这样的输出:
cluster status : slave - worker id 15 workers : undefined
cluster status : slave - worker id 14 workers : undefined
所以我猜 worker 只能从 master 获得,但是有没有办法为 slave 与其他 slave 通信?
没错,'workers' 属性 仅在主进程中可用(参见 latest documentation)。
我不认为 worker 可以通过任何方式直接相互通信 - 所有通信都通过 master。
您可以很容易地使用 'message' 机制来设置一个系统,使用 master 作为中继在 worker 之间路由消息。我不太确定您要实现的目标,但这是一个概述。
您发布的第一段代码的想法是您 运行 它在主控中,这意味着当主控从任何一个接收到消息时调用 "messageHandler" 回调它的工人。事实上,您可以通过以下方式实现相同的目的:
cluster.on('message', messageHandler);
向 messageHandler 函数传递了一个参数,用于标识发送消息的工作人员。
同样,worker 可以通过这样做来监听来自 master 的消息:
process.on('message', workerMessageHandler);
您可以通过以下方式发送消息:
// Worker: send message to master
process.send({ cmd: 'notifyRequest', data: 'somedata' });
// Master: send message to specific workers
worker.send({ data: 'somedata' });
cluster.workers[0].send({ whatever: 'something' });
消息可以是字符串或对象(将被序列化为JSON)。