【NOTE】【深入浅出nodejs】异步编程(四)

异步并发控制

同步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() 方法来满足该需求

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值