Javascript 如何使用并行子进程执行;工作“;在大型阵列上?
我有大量的数字。我想使用JavaScript/Node.js计算所有数字的总和。(就这个问题而言,这是一个简单的求和;实际上,我有一个更复杂、更冗长的数学运算要做) 在单线程世界中,计算总和需要很长时间。为了更快地处理结果,我一直在尝试将工作委托给并行运行的多个子进程。每个子进程确定子数组的和,所有内容都在父进程中求和 我的两个脚本如下: index.jsJavascript 如何使用并行子进程执行;工作“;在大型阵列上?,javascript,node.js,concurrency,parallel-processing,child-process,Javascript,Node.js,Concurrency,Parallel Processing,Child Process,我有大量的数字。我想使用JavaScript/Node.js计算所有数字的总和。(就这个问题而言,这是一个简单的求和;实际上,我有一个更复杂、更冗长的数学运算要做) 在单线程世界中,计算总和需要很长时间。为了更快地处理结果,我一直在尝试将工作委托给并行运行的多个子进程。每个子进程确定子数组的和,所有内容都在父进程中求和 我的两个脚本如下: index.js function computeSum(data) { var start = new Date(); var sum = data
function computeSum(data) {
var start = new Date();
var sum = data.reduce(function(a, b) { return a + b; });
console.log("Sum = %s, Time = %s ms", sum, new Date().getTime() - start.getTime());
}
function computeSumConcurrent(data) {
var child_process = require("child_process");
var os = require("os");
var cpuCount = os.cpus().length;
var subArraySize = data.length / cpuCount;
var childProcessesFinished = 0;
var start = new Date();
var sum = 0;
for (var i = 0; i < cpuCount; i++) {
var childProcess = child_process.fork("child.js");
childProcess.on("message", function(message) {
sum += message.sum;
childProcessesFinished++;
if (childProcessesFinished == cpuCount) {
console.log("Sum = %s, Time = %s ms", sum, new Date().getTime() - start.getTime());
process.exit();
}
});
childProcess.send({ subArray: data.slice(subArraySize * i, subArraySize * (i + 1)) });
}
}
console.log("Populating array...");
var data = []
for (var i = 0; i < 50000000; i++) {
data.push(Math.random());
}
console.log("Computing sum without using child processes...");
computeSum(data);
console.log("Computing sum using child processes...");
computeSumConcurrent(data);
process.on("message", function(message) {
var sum = message.subArray.reduce(function(a, b) { return a + b; });
process.send({ sum: sum });
process.exit();
});
如果运行index.js,您会发现并行求和速度非常慢。我认为这可能是由于childProcess.send
,但我不能完全确定
那么这类事情的解决方案是什么呢?如何使并行求和比单线程求和更快?为小型工作创建子进程并发送和接收消息实际上可以增加持续时间或处理速度,因为发送和接收消息需要时间 还有另一个问题,在你的代码中,你实际上是在将子进程的工作从主进程本身中分离出来,这不会使你的主进程从工作中解脱出来,只会使它增加更多 我建议你另一种方法
请随意询问您是否需要一些示例。我的父进程已经做了很少的工作。为什么要创建一个子进程,然后再创建自己的多个子进程?您的解决方案如何克服
childProcess.send的缓慢性?如果不是这样的话,并且您的父进程已经为您做了很少的工作,那么实际上我有一个更复杂、更冗长的数学运算要执行!那么你就浪费了更多的时间来创建fork,给它们发消息,得到回复,然后把它们加起来。子进程数量的增加会显著增加消息传递和获取回复的时间开销。2.更少的进程数量将无法节省您的时间,因此更好的平衡将有助于减少操作所需的时间。还有一件事:子进程不是用来减少进程完成任务所需的时间,而是用来从父进程中消除大型操作的负担。。所以我希望这些信息能帮助你。