Jac*_*Lee 22 javascript static cluster-computing interprocess node.js
我想要以下内容
这是我的代码,显然没有实现我的目标.
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);
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试将大表保存到MongoDB中,以便每个进程都可以轻松访问数据.但是表大小非常大,即使使用索引,MongoDB也需要大约10秒才能完成查询.这太慢了,我的实时应用程序无法接受.我也试过Redis,它在内存中保存数据.但Redis是一个键值存储,我的数据是一个表.我还写了一个C++程序来将数据加载到内存中,查询花了不到1秒钟,所以我想在node.js中模拟它.
Shi*_*vam 12
如果我用几句话翻译您的问题,您需要与WORKER实体共享MASTER实体的数据.使用事件可以非常轻松地完成:
从师父到工人:
worker.send({json data}); // In Master part
process.on('message', yourCallbackFunc(jsonData)); // In Worker part
Run Code Online (Sandbox Code Playgroud)
从工人到大师:
process.send({json data}); // In Worker part
worker.on('message', yourCallbackFunc(jsonData)); // In Master part
Run Code Online (Sandbox Code Playgroud)
我希望通过这种方式可以双向发送和接收数据.如果您发现它有用,请将其标记为答案,以便其他用户也可以找到答案.谢谢
您正在寻找共享内存,node.js不支持.您应该寻找替代方案,例如查询数据库或使用memcached.
在 node.js 中 fork 的工作方式与在 C++ 中不同。它不是复制进程的当前状态,而是运行新进程。因此,在这种情况下,变量不共享。每行代码都适用于每个进程,但主进程将 cluster.isMaster 标志设置为 true。您需要为每个工作进程加载数据。如果您的数据真的很大,请小心,因为每个进程都有自己的副本。我认为您需要在需要时立即查询部分数据,或者如果您真的需要将它们全部保存在内存中,则需要等待。
如果只读访问适用于您的应用程序,请尝试使用我自己的共享内存模块.它mmap在封面下使用,因此数据在访问时加载,而不是一次性加载.内存在机器上的所有进程之间共享.使用它非常简单:
const Shared = require('mmap-object')
const shared_object = new Shared.Open('table_file')
console.log(shared_object.property)
Run Code Online (Sandbox Code Playgroud)
它为您提供了一个到字符串或数字的键值存储的常规对象接口.它在我的应用程序中超级快.
| 归档时间: |
|
| 查看次数: |
13505 次 |
| 最近记录: |