Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用并行子进程执行;工作“;在大型阵列上?_Javascript_Node.js_Concurrency_Parallel Processing_Child Process - Fatal编程技术网

Javascript 如何使用并行子进程执行;工作“;在大型阵列上?

Javascript 如何使用并行子进程执行;工作“;在大型阵列上?,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

我有大量的数字。我想使用JavaScript/Node.js计算所有数字的总和。(就这个问题而言,这是一个简单的求和;实际上,我有一个更复杂、更冗长的数学运算要做)

在单线程世界中,计算总和需要很长时间。为了更快地处理结果,我一直在尝试将工作委托给并行运行的多个子进程。每个子进程确定子数组的和,所有内容都在父进程中求和

我的两个脚本如下:

index.js

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.更少的进程数量将无法节省您的时间,因此更好的平衡将有助于减少操作所需的时间。还有一件事:子进程不是用来减少进程完成任务所需的时间,而是用来从父进程中消除大型操作的负担。。所以我希望这些信息能帮助你。