如何限制并发exectuions?

我想下载70个图像。 他们的完整大小约为100MB。

这是我简化的代码部分

function downloadImage(src){ var dst = '...'; request(src).pipe(fs.createWriteStream(dst)); return dst; } arrayOf70.forEach(function(e){ var thing = new Thing({ // ... image: downloadImage(url) }); thing.save(); } 

问题是有太多的并发下载。 好的第一步:通过一个巨大的超时要求。

 request({url: src, timeout: 120000000}).pipe(fs.createWriteStream(dst)); 

那么,因为它超过了操作系统的TCP超时,所以效果不好。 至less我认为这是问题。 无论如何,我正在得到超时连接

 stream.js:94 throw er; // Unhandled stream error in pipe. ^ Error: connect ETIMEDOUT at exports._errnoException (util.js:746:11) at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1000:19) 

所以。 要限制并发下载量的方法是什么?

超时并不是一个理想的解决scheme。 你真正需要的是能够等待下载完成,之后立即开始新的下载。 而那个并行的具体次数。 你可以通过callback来实现。

 function downloadImage(src, callback){ var dst = '...'; http.get(src, function(res) { res.pipe(fs.createWriteStream(dst)) .on("finish", function() { callback(dst); }); }); } function downloadAllImages(array) { var idx = 0; function downloadLoop() { if(idx >= array.length) return; downloadImage(array[idx++], function(dst) { var thing = new Thing({ // ... image: dst }); thing.save(); downloadLoop(); }); } for(var i = 0; i < 5; i++) downloadLoop(); //start 5 concurrent download "loops" } 

这是一个setInterval的例子:

 var array_length = arrayOf70.length; var i = 0; var request_interval = setInterval(makeRequest, 100); function makeRequest() if(i<array_length){ var thing = new Thing({ // ... image: downloadImage(url) }); thing.save(); i++; }else{ clearInterval(request_interval); } },100);