在的node.js,如何声明可以由主进程被初始化并通过工作进程访问的共享变量?(In node.js

2019-06-25 09:36发布

我想下面的

  • 在启动过程中,主处理从文件加载一个大表,并将其保存到共享变量。 该表有9列和12万行,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秒就可以完成我的查询即使有一个索引。 这是太慢,对我的实时应用不能接受的。 我也曾尝试Redis的,它在内存中保存的数据。 但Redis是一个key-value存储和我的数据是一个表。 我也写了一个C ++程序加载数据到内存中,并查询了不到1秒,所以我想在node.js中效仿这一

Answer 1:

您正在寻找的共享内存,这Node.js的只是不支持 。 你应该寻找替代品,如查询数据库或使用memcached的 。



Answer 2:

如果我翻译几句话你的问题,你需要与WORKER实体分享MASTER实体的数据。 它可以很容易利用事件来完成:

由主到工人:

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

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

从工人到站长:

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

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

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



Answer 3:

如果只读访问是好的为您的应用程序,尝试我自己的共享内存模块 。 它采用mmap被窝里,这样它的访问,而不是一次全部数据加载。 该存储器是机器上的所有进程之间共享。 使用它是超级简单:

const Shared = require('mmap-object')

const shared_object = new Shared.Open('table_file')

console.log(shared_object.property)

它给你一个有规则的界面字符串或数字的key-value存储。 这是在我的应用程序超快。

还有一个模块的实验读写版本可用于测试。



Answer 4:

在Node.js的叉作品不是在C ++喜欢。 这不是复制过程的当前状态,它的运行新的进程。 所以,在这种情况下,变量不共享。 每一行代码都适用于每一个过程,但主进程具有cluster.isMaster标志设置为true。 你需要加载数据,每工作进程。 要小心,如果你的数据真的是巨大的,因为每个进程都会有自己的副本。 我认为你需要,只要你需要他们或等待,如果你真的需要这一切在内存中查询数据的部分。



Answer 5:

您可以使用Redis的。

Redis的是一个开源的,BSD授权的,先进的键值缓存和存储。 它经常被称为数据结构服务器因为密钥可以包含字符串,散列,列表,集合排序集合,位图和hyperloglogs。

redis.io



文章来源: In node.js, how to declare a shared variable that can be initialized by master process and accessed by worker processes?