javascript - 在node.js中,如何声明一个可以被master进程初始化并被worker进程访问的共享变量?

标签 javascript node.js static cluster-computing interprocess

我想要以下

  • 在启动过程中,主进程从文件中加载一个大表并将其保存到一个共享变量中。该表有 9 列和 1200 万行,大小为 432MB。
  • 工作进程运行 HTTP 服务器,接受对大表的实时查询。

这是我的代码,显然没有达到我的目标。

var my_shared_var;
var cluster = require('cluster');
var numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
  // Load a large table from file and save it into my_shared_var,
  // hoping the worker processes can access to this shared variable,
  // so that the worker processes do not need to reload the table from file.
  // The loading typically takes 15 seconds.
  my_shared_var = load('path_to_my_large_table');

  // Fork worker processes
  for (var i = 0; i < numCPUs; i++) {
    cluster.fork();
  }
} else {
  // The following line of code actually outputs "undefined".
  // It seems each process has its own copy of my_shared_var.
  console.log(my_shared_var);

  // Then perform query against my_shared_var.
  // The query should be performed by worker processes,
  // otherwise the master process will become bottleneck
  var result = query(my_shared_var);
}

我尝试将大表保存到 MongoDB 中,以便每个进程都可以轻松访问数据。但是表太大了,即使有索引,MongoDB 也需要大约 10 秒才能完成我的查询。这太慢了,对于我的实时应用程序来说是 Not Acceptable 。我也尝试过 Redis,它将数据保存在内存中。但是 Redis 是一个键值存储,我的数据是一个表。我还写了一个 C++ 程序将数据加载到内存中,查询时间不到 1 秒,所以我想在 node.js 中进行模拟。

最佳答案

如果我用几句话翻译您的问题,您需要与 WORKER 实体共享 MASTER 实体的数据。使用事件可以很容易地完成:

从大师到 worker :

worker.send({json data});    // In Master part

process.on('message', yourCallbackFunc(jsonData));    // In Worker part

从 worker 到主人:

process.send({json data});   // In Worker part

worker.on('message', yourCallbackFunc(jsonData));    // In Master part

我希望通过这种方式您可以双向发送和接收数据。如果您觉得有用,请将其标记为答案,以便其他用户也可以找到答案。谢谢

关于javascript - 在node.js中,如何声明一个可以被master进程初始化并被worker进程访问的共享变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10965201/

相关文章:

javascript - 将带有普通对象数组的普通对象展开为平面普通对象

java - 如何在不将方法设为静态的情况下使用@Enclosed

c - 静态函数的外部声明是否会破坏内部链接?

java - 在Java中使用两个线程打印奇数和偶数

javascript - 重用与后端服务器的 http 连接 - web fetch API

javascript - 单引号在 IOS 和 Sierra 上的处理方式不同吗?

javascript - 如何将 onclick 事件处理程序作为类方法

javascript - 循环 JSON,将一些键存储在其他 JSON 对象中

javascript - Heroku 上的 Angular 应用程序部署问题

javascript - 从 npm 包的子文件夹导入