【问题标题】:NodeJS cluster global variablesNodeJS 集群全局变量
【发布时间】:2018-06-09 03:53:22
【问题描述】:

我需要为所有工人有一个共同的计数器,每个人都可以增加它,并且所有工人都知道计数器已经增加了。 我怎样才能做到这一点 ? 所有工作人员只能看到局部变量,并且只能看到静态全局变量。

【问题讨论】:

  • 这里的静态全局变量是什么意思?
  • 这个帖子会帮助你nodejs.org/api/…

标签: node.js multithreading cluster-computing


【解决方案1】:

要实现这一点,您需要使用 Node.js 中的 cluster 模块在工作线程和主线程之间发送消息。

示例代码

这是我刚刚整理的一个工作示例。我正在使用官方网站(9.3.0)上提供的最新版本的 Node.js。

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

官方文档

Here is the documentation for worker.send(message[, sendHandle][, callback])

【讨论】:

  • 我需要全部增加同一个计数器,而不是每个人自己的例如:1/1632:COUNTER 1 2/6200:COUNTER 2 2/6200:COUNTER 3 1/1632:COUNTER 4跨度>
  • 本例中计数器变量存储在主进程中,并在计数器更新时通知每个工作人员。如果一个工作人员发送消息来更新计数器,主服务器会更新它,然后通知每个工作人员。如果您正在寻找要在不同进程之间共享的确切内存位置,这是不可能的,因为 Node.js 是单线程的。有关线程与分叉进程的差异,请参阅此问题的答案stackoverflow.com/questions/11566780/…
  • @Inomezi 另外,您在评论中提供的示例仅将更新后的计数器发送给单个工作人员,这是您想要的吗?在您最初的问题中,您指定“所有工人都知道计数器已增加”
  • 例如我们有 2 个工人。他们应该将计数器增加到 10,然后停止。但两者都必须增加相同的计数器,而不是各自增加
  • @Inomezi 你是说应该为每个工人增加计数器吗?您的示例显示了一个不同的计数器编号传递回每个工作人员123,最后是4。如果是这种情况,只需从我的示例中删除counter++,并将发送给工作人员的消息中的value: counter 更改为value: ++counter。否则,需要更详细地更新问题(例如,如果是这种情况,那么所有工人不会知道计数器增加了)。
猜你喜欢
  • 2018-05-03
  • 1970-01-01
  • 2020-02-29
  • 2012-10-09
  • 1970-01-01
  • 2013-09-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多