异步并发控制
同步I/O 因为每个 I/O 都是彼此阻塞的,再循环体中,总是一个接着一个调用,不会出现耗用文件符太多的情况,同时性能低下。再异步I/O中,虽然容易实现并发,但是需要控制(因为没有约束,太容易实现了)
1. bagpipe (GitHub - JacksonTian/bagpipe: Async call limit)
通过一个队列来控制并发量
- 如果当前活跃(指调用发起但未执行回调)的异步调用量小于限定值,从队列中取出执行。
- 如果活跃调用达到限定值,调用暂时存放在队列中。
- 每个异步调用结束时,从队列中取出新的异步调用执行。
实现方法:
var Bagpipe = require('bagpipe');
// Sets the max concurrency as 10
var bagpipe = new Bagpipe(10);
for (var i = 0; i < 100; i++) {
bagpipe.push(async, function () {
// execute asynchronous callback
});
}
以上代码是通过暴露 push()方法和full事件。 其类似于打开了一道窗口允许异步调用并行进行,但是严格限定上限,仅仅在push()时分开传递,并不对原有API有任何侵入
拒绝模式
var bagpipe = new BagPipe(10, {
refuse: true
});
超时控制
var bagpipe = new BagPipe(10, {
timeout: 1000
});
2. async
async提供了一个方法用于处理异步调用的限制:parallelLimit()
async.parallelLimit([
function(callback){
callback(null, 'one');
},
function(callback){
callback(null, 'two');
}
],
2,
function(err, results){
});
parallelLimit函数和parallel类似,但是它多了一个参数limit。 limit参数限制任务只能同时并发一定数量,而不是无限制并发
缺点无法动态地增加并行任务。async提供了queue() 方法来满足该需求