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

标签 node.js asynchronous parallel-processing

是否可以使用 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 次。但是在这种情况下我如何限制并行运行的进程?

最佳答案

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

在您的例子中,您只将一个函数传递给 parallelLimit。这就是为什么它只被调用一次。如果您要多次传递具有相同功能的数组,它会在您将它放入数组中时执行多次。

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

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

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

关于node.js - 如何使用 async.parallelLimit 来最大化(并行)运行进程的数量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37526207/

相关文章:

c# - Parallel.ForEach 停止为最后几个项目并行

javascript - 如何在 Node js中使用oracle高级队列(OAQ)

node.js - 如何避免 Node child_process exec中的命令注入(inject)

objective-c - (异步)NSURLConnection : what's going on underneath?

c# - 如何仅通过一个线程使用 .net 异步 CTP

c++ - tbb:task_scheduler_init 自定义分配器?

c - 在 MPI 中写入文本文件

javascript - 设置 Pino 级别给我 'log_1.default.level is not a function'

node.js - DDP、Node 和 Chrome Browserify

node.js - 使用 NodeJs 异步查询 redshift 集群