node.js - 在 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 ]
解决方案
那是因为您的代码从一开始就执行了 3 次,所以每个变量对于每个工作人员来说都是唯一的。想一想正在运行 3 个不同的应用程序,它们彼此不共享变量。
worker 上的变量与a
worker1
中的变量不同。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
当然,您可以改进此代码,这只是示例。
推荐阅读
- php - 使用 Web 服务器和 PHP 在计算机上打开应用程序
- html - 我可以显示 .webp 图像但允许用户下载 PNG 吗?
- python - 使用 Raspberry Pi 4 和 PiCam 时出现分段错误
- php - Laravel livewire 实时验证故障,移动连接速度慢
- c++ - 无法调用 initializer_list 构造函数
- microsoft-graph-api - 有没有办法使用 C# SDK 从 Microsoft Graph API 获取已删除的目录项?
- regex - 在正则表达式中转义字符
- r - 在 R 中设计一个表
- reactjs - 将数据上传到表没有结果
- plugins - composer.json 文件配置以在 custom/plugins 目录中安装 Shopware 6 插件