我正在使用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倍,但同样的方式。所以这个过程的时间实际上要长得多!?
非常感谢帮助。
亲切的问候
答案 0 :(得分:1)
嗯,这是node.js和大多数其他语言的限制之一。因为节点是单线程的,所以它只使用你的一台机器核心,并使用异步/非阻塞设计模拟多线程。
群集不会帮助你,因为它会在每个核心上创建多个脚本实例,但它们都在执行相同的任务,每个都没有通信,所以它对你没用。
您可以做的是将代码划分为多个独立代码块,并创建一个子进程以在不同的内核上运行,以便代码更有效地使用您的机器代码。
或者在golang :)中重写它,这样可以让您轻松利用机器的所有内核。