Node.js-使用 async 控制并发数

asynceventproxy 同样都是控制并发的,eventproxy 会同时发起所有请求,但是我们有 1000 个链接要去请求,那么不可能同时发出 1000 个并发链接出去对不对?我们需要控制一下并发的数量,比如并发 10 个就好,然后慢慢请求完这 1000 个链接。使用 async 则可以很好地解决这个问题,使用 async 能够控制并发线程的数量

1.async

2. 使用async限制并发访问数量

//伪造一组链接
var urls = [];
for(var i = 0; i < 30; i++) {
    urls.push('http://__' + i);
}
//使用 async.mapLimit 来并发抓取,并获取结果
var concurrencyCount = 0; // 并发连接数的计数器
async.mapLimit(urls, 5, function (url, callback) {
    // delay 的值在 2000 以内,是个随机的整数
    var delay = parseInt((Math.random() * 10000000) % 2000, 10);
    concurrencyCount++;
    console.log('现在的并发数是', concurrencyCount, ',正在抓取的是', url, ',耗时' + delay + '毫秒');
    setTimeout(function () {
        concurrencyCount--;
        callback(null, url + ' html content');
    }, delay);
}, function (err, result) {
    // 在所有的异步执行结束后将被执行
    console.log('final:');
    console.log(result);
});

3. mapLimit方法的callback参数

一定要调用该回调函数,不然不会再继续循环,一般来说会有三种常用的使用方法

形式 解释
callback(null) 本次循环完成
callback(null,data) 本次循环完成,并且返回数据data追加到results
callback(data) 本次循环失败,不会再继续循环,直接到最后的callback