【发布时间】:2018-04-12 19:23:56
【问题描述】:
我的代码将大量文件从一个云存储传输到另一个云存储(同一区域)。工作流程是下载源文件流,然后将流上传到目标存储。
如果在 non-promise 循环中运行它们,传输速度很快(比如 100M/s),但会达到内存限制。最后服务器崩溃。
如果在promise链中,即在上一个作业完成后运行下一个作业,crash问题解决了,但是传输速度很慢(比如10M/s)。
我的问题:为什么承诺会影响下载和上传速度?还是我错过了什么?
代码sn-p:
transferArray.forEach(function (eachTransfer) {
queue = queue.then(function(result){
// put result somewhere
return eachFileTransfer(jobId,userid,eachTransfer);
});
});
queue.then(function(){
console.log('done');
});
我正在考虑使用带有并发的 PromisePool,但不确定速度会提高多少,以及我应该设置的合理数量的并发。参考帖子: Execute promises concurrently with a buffer pool size in Javascript
【问题讨论】:
-
您是同时运行它们还是一个接一个地运行它们?一个原因是
10 * 100M/s * 1与1 * 1000M/s * 10。池的大小将取决于情况。 -
没有任何代码,我们都会猜测。我的猜测是,promise 链一次运行一个,而 for 循环同时运行一堆传输——最终试图运行太多。
-
“我正在考虑将 PromisePool 与并发一起使用” 很可能是答案。将并发设置为您希望同时运行的传输次数(根据您的问题,可能是 10)。
-
谢谢你们!我的代码 sn-p 已发布。我认为你是对的,原生速度就是这样,但是在非承诺模式下,所有的都是一起运行的,所以我认为原生速度很快..我会尝试使用 PromisePool
标签: javascript promise es6-promise