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