Node.js NodeJS集群全局变量
我需要为所有工人提供一个通用计数器,每个人都可以增加它,并且所有工人都知道计数器已经增加了。 我该怎么做?Node.js NodeJS集群全局变量,node.js,multithreading,cluster-computing,Node.js,Multithreading,Cluster Computing,我需要为所有工人提供一个通用计数器,每个人都可以增加它,并且所有工人都知道计数器已经增加了。 我该怎么做? 所有工作进程只能看到本地变量,只能看到静态全局变量。要实现这一点,您需要使用Node.js中可用的集群模块在工作进程和主进程之间发送消息 示例代码 这是我刚刚整理的一个工作示例。我使用的是官网上提供的Node.js的最新版本(9.3.0) 示例输出 官方文件 我需要所有人增加相同的计数器,而不是每个人自己的计数器,例如:1/1632:counter 1 2/6200:counter 2/6
所有工作进程只能看到本地变量,只能看到静态全局变量。要实现这一点,您需要使用Node.js中可用的
集群
模块在工作进程和主进程之间发送消息
示例代码
这是我刚刚整理的一个工作示例。我使用的是官网上提供的Node.js的最新版本(9.3.0
)
示例输出
官方文件
我需要所有人增加相同的计数器,而不是每个人自己的计数器,例如:1/1632:counter 1 2/6200:counter 2/6200:counter 3 1/1632:counter 4在本例中,计数器变量存储在主进程中,并在计数器更新时通知每个工人。如果一个工人发送消息更新计数器,则主机将更新计数器,然后通知每个工人。如果要在不同进程之间共享确切的内存位置,这是不可能的,因为Node.js是单线程的。有关线程与分叉进程的区别,请参见此问题的答案。@Inomezi另外,您在评论中给出的示例只是将更新的计数器发送给单个工作进程,这是您想要的吗?在最初的问题中,您指定了“所有工人都知道计数器已增加”,例如,我们有2名工人。他们应该将计数器增加到10,然后停止。但两者必须增加相同的计数器,而不是每个计数器own@Inomezi你是说每个工人的柜台都应该增加吗?您的示例显示了传递回每个工作人员的不同计数器编号
1
,2
,3
,最后是4
。如果是这种情况,只需从我的示例中删除counter++
,并将发送给工人的消息中的value:counter
更改为value:++counter
。否则,需要更详细地更新问题(例如,如果是这种情况,那么所有工作人员都不会知道计数器增加了)。这里的静态全局变量是什么意思?此线程将帮助您
const cluster = require('cluster');
const INCREMENT = 'INCREMENT';
const COUNTER = 'COUNTER';
if (cluster.isMaster) {
cluster.fork();
cluster.fork();
let counter = 0;
cluster.on('message', (worker, msg, handle) => {
if (msg.topic && msg.topic === INCREMENT) {
// here we increment the counter
counter++;
for (const id in cluster.workers) {
// Here we notify each worker of the updated value
cluster.workers[id].send({
topic: COUNTER,
value: counter
});
}
}
});
} else if (cluster.isWorker) {
console.log(`Worker id: ${cluster.worker.id}`);
// Here is a function that requests the counter be updated in the master from a worker.
function incrementCounter() {
process.send({ topic: INCREMENT });
}
// A dummy timeout to call the incrementCounter function
setTimeout(incrementCounter, 1000 * cluster.worker.id);
// Handle the counter update
process.on('message', (msg) => {
if (msg.topic && msg.topic === COUNTER) {
console.log(`${cluster.worker.id}/${process.pid}: ${msg.topic} ${msg.value}`);
}
});
}
Worker id: 1
Worker id: 2
1/1632: COUNTER 1
2/6200: COUNTER 1
2/6200: COUNTER 2
1/1632: COUNTER 2