如何在Nodejs中进行聚类 - 只需本地计算

时间:2018-05-25 19:03:52

标签: javascript node.js

我正在使用nodejs来进行一些计算(没有快速应用程序!)。

我的文件" computation.js"正在经历大量数据并进行大量计算。最后,我收到了一个简单的结果。

由于计算量很大,并且我的16个核心中只有一个被使用,我的装备仍需要很长时间。

如何利用我的16核?关于nodejs的Cluster Module的所有示例总是假设某种http连接。

我没有运气就尝试了以下内容:

//cluster.js
var cluster = require('cluster');
var numCPUs = 16;

if (cluster.isMaster) {
for (var i = 0; i < numCPUs; i++) {
    cluster.fork();
}
} else {
require('./calculations');
}

编辑:

//calculations.js
const array = [{name: "target"},{name:"walmart"},{}, etc. ] // 150 objects

array.map((supermarket) => {
calculationFunction(supermarket.name);
}

编辑:对我来说,如果array.map函数以某种方式&#34; clustered&#34; - 意味着函数的150次调用&#34; calculationFunction&#34;将分布在我的16个核心上。这应该很容易,不行!?

似乎我的档案&#34;计算&#34;现在刚刚开始16倍,但同样的方式。所以这个过程的时间实际上要长得多!?

非常感谢帮助。

亲切的问候

1 个答案:

答案 0 :(得分:1)

嗯,这是node.js和大多数其他语言的限制之一。因为节点是单线程的,所以它只使用你的一台机器核心,并使用异步/非阻塞设计模拟多线程。

群集不会帮助你,因为它会在每个核心上创建多个脚本实例,但它们都在执行相同的任务,每个都没有通信,所以它对你没用。

您可以做的是将代码划分为多个独立代码块,并创建一个子进程以在不同的内核上运行,以便代码更有效地使用您的机器代码。

或者在golang :)中重写它,这样可以让您轻松利用机器的所有内核。