gpt4 book ai didi

javascript - 如何限制并发执行?

转载 作者:行者123 更新时间:2023-11-30 16:50:04 24 4
gpt4 key购买 nike

我想下载 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 超时,所以效果不佳。至少我认为这是问题所在。不管怎样,我的连接超时了

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)

所以。限制并发下载量有什么办法?

最佳答案

超时不是一个理想的解决方案。您真正需要的是等待下载完成然后立即开始新下载的能力。并表示特定次数的并行。您可以使用回调来做到这一点。

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"
}

关于javascript - 如何限制并发执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30656322/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com