【问题标题】:how to use async.parallelLimit to maximize the amount of (parallel) running processes?如何使用 async.parallelLimit 最大化(并行)运行进程的数量?
【发布时间】:2016-09-28 07:34:24
【问题描述】:

是否可以使用 async.parallelLimit 为并行运行的进程设置一个限制?我使用以下非常简单的代码来测试它是如何工作的。

var async = require("async");
var i = 0;

function write() {
    i++;
    console.log("Done", i);
}

async.parallelLimit([
    function(callback) {
        write();
        callback();
    }
], 10, function() {
    console.log("finish");
});

当然,我得到的一切都是这样的:

Done 1
finish

在我的例子中,我有一个经常被调用的函数,但我只希望它同时运行 5 次。其他呼叫应排队。 (是的,我知道 async.queue ,但这不是我在这个问题中想要的)。

所以现在的问题是,async.parallelLimit 是否可行?

//编辑:

其实我也有类似的东西:

for(var i = 0; i < somthing.length; i++) { //i > 100  for example
    write();
}

因为 node.js 的不同步性,它可以同时运行 100 次。但是在这种情况下,我如何限制并行运行的进程?

【问题讨论】:

    标签: node.js asynchronous parallel-processing


    【解决方案1】:

    为了完成,添加到现有答案中,如果您想在限制的情况下多次并行运行相同的功能,您可以这样做:

      // run 'my_task' 100 times, with parallel limit of 10
    
      var my_task = function(callback) { ... };
      var when_done = function(err, results) { ... };
    
      // create an array of tasks
      var async_queue = Array(100).fill(my_task);
    
      async.parallelLimit(async_queue, 10, when_done);
    

    【讨论】:

      【解决方案2】:

      非常简短的回答;是的。这正是 asyncParallelLimit 所做的。

      在您的情况下,您只将一个函数传递给parallelLimit。这就是为什么它只被调用一次。如果您要多次传递具有相同函数的数组,则它将执行多次,因为您将其放入数组中。

      请注意,您的示例函数实际上并没有异步执行任何工作。因此,此示例函数将始终按顺序执行。如果您有一个执行异步工作的函数,例如网络请求或文件 i/o,它将被并行执行。

      异步工作负载的更好示例函数是:

      function(callback) {
          setTimeout(function(){
              callback();
          }, 200);
      }
      

      【讨论】:

      • 等一下,我会更新我的问题,向您展示我到底需要什么
      猜你喜欢
      • 1970-01-01
      • 2021-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多