并发数量控制怎么实现?
发布于 9 年前 作者 zstxt1989 10357 次预览 最后一次回复是 9 年前 来自 问答
一开始我想的太简单了
var tasks = 0;//当前并发数量
function foo(url){
while(tasks > 2){//并发超过2,无限循环等前面的任务执行结束
continue;
}
tasks++;
http.get(url,function(){
tasks--;//任务执行完毕,tasks-1
})
}
var urls = [....]
for(var i in urls) {
foo(urls[i]);
}
node是单线程的,while死循环导致异步任务没法进行,tasks–也就无法执行到。 请教一下有没有其他办法可以人为控制并发数量和异步任务时间间隔?
10 回复
深入浅出nodejs一书中,9页表格下面。 有说道:
看能否供参考?
要这么干的话使用settimeout将任务延后吧
并发数量可以看做是 worker 数目, 每个 worker 从 task queue 里面取任务
用bluebird的Promise.map可以设置concurrency
bluebird Promise.map确实可以控制并发,不想用bluebird的可以用这个 https://github.com/magicdawn/promise.map
promise-map这个包名被另一个人拿去用 arr.map 去简单map一下了,相当于并发为Infinity. 于是就有了promise.mappromise.map 代码是取自 async.parallelLimit, 使用 callback 的方式的童鞋可以用这个 async.js
@bigtree9307 @magicdawn 谢谢两位的建议,其实我也往这方面考虑了,用的eventproxy来实现的。思路大致如下:
发现 async.queue 非常合适用来控制并发,附上代码:
async 有各种 limit 结尾的函数专门用来处理并发。如果你的场景比较类似队列的话,就用 async.queue