如何使用 async.parallelLimit 最大化(并行)运行进程的数量?

nov*_*ova 6 parallel-processing asynchronous node.js

是否可以使用 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");
});
Run Code Online (Sandbox Code Playgroud)

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

Done 1
finish
Run Code Online (Sandbox Code Playgroud)

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

所以现在的问题是,这可以通过 async.parallelLimit 实现吗?

//编辑:

我实际上有类似的东西:

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

由于 Node.js 的非同步性,这可能会同时运行 100 次。但是在这种情况下,shell 如何限制并行运行的进程呢?

Tin*_*ank 5

非常简短的回答;是的。这正是 asyncParallelLimit 的作用。

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

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

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

function(callback) {
    setTimeout(function(){
        callback();
    }, 200);
}
Run Code Online (Sandbox Code Playgroud)