Javascript 从Promise.all内的url并行下载图像
我正在编写一个脚本,该脚本包含一个名称列表,每个名称从URL下载3个图像。要从数组中获取每个名称,我使用Promise.all,目前还没有问题。但我想为一个播放器并行下载3张图片,以加快速度,因为我需要以最快的方式完成。所以我看到,如果我只下载一张图片,需要大约2分钟来浏览所有的名字。但如果我再为一个玩家添加两张图片下载,我会在8分钟内浏览所有的名字。这是不合逻辑的,不是吗?如果我进行3次并行下载,它必须与1次下载具有相同的时间(+/-),我做了什么或认为错了什么?这是我的代码,对于并行下载,我使用Pqueue库,用于图像下载图像下载程序npm libJavascript 从Promise.all内的url并行下载图像,javascript,node.js,promise,parallel-processing,Javascript,Node.js,Promise,Parallel Processing,我正在编写一个脚本,该脚本包含一个名称列表,每个名称从URL下载3个图像。要从数组中获取每个名称,我使用Promise.all,目前还没有问题。但我想为一个播放器并行下载3张图片,以加快速度,因为我需要以最快的方式完成。所以我看到,如果我只下载一张图片,需要大约2分钟来浏览所有的名字。但如果我再为一个玩家添加两张图片下载,我会在8分钟内浏览所有的名字。这是不合逻辑的,不是吗?如果我进行3次并行下载,它必须与1次下载具有相同的时间(+/-),我做了什么或认为错了什么?这是我的代码,对于并行下载,我
const {default: PQueue} = require('p-queue');
const queue = new PQueue({concurrency: 10});
const download = require('image-downloader');
const fs = require('fs');
const playersListDataUpdate = async function(playersList, serverId, currentTimeStamp){
let values = [];
let placeholders = '';
await Promise.all(playersList.map(async (name) => {
values.push(name, currentTimeStamp, serverId);
placeholders += ' (?, ?, ?),';
//Update skins of user
if (!fs.existsSync('../uploads/players/'+name)) {
fs.mkdirSync('../uploads/players/'+name);
}
await queue.addAll([
async () => {
//Head
try {
await download.image({
url: 'https://minotar.net/avatar/'+name,
dest: '../uploads/players/' + name + '/face_' + name + '.png'
});
console.log('Saved skinhead of '+name);
} catch (e) {
console.log('Failed to save head of '+name);
}
},
async () => {
//Preview
try {
await download.image({
url: 'https://minotar.net/armor/body/'+name,
dest: '../uploads/players/' + name + '/skin_preview_' + name + '.png'
});
console.log('Saved skinpreview of '+name);
} catch (e) {
console.log('Failed to save skin preview of '+name);
}
},
async () => {
//Skin
try {
await download.image({
url: 'https://minotar.net/skin/'+name,
dest: '../uploads/players/' + name + '/skin_download_' + name + '.png'
});
console.log('Saved skindownload of '+name);
} catch (e) {
console.log('Failed to save skin of '+name);
}
},
]);
}));
return {
'values': values,
'placeholders': placeholders.slice(0, -1)
};
}
我猜你没有从你的
map
返回承诺,所以你的承诺。所有的都没有任何并行运行的承诺
更改您正在执行的行addAll
,以返回承诺,而不是解析。像这样
return queue.addAll([
....
]);
您是否在浏览器中运行它?许多浏览器将并发请求的数量限制为一个域。我会在每个异步函数的最开始处添加另一个console.log,并检查每个函数是否立即打印。@MatthiasHauert,我在shellMh中运行它,如果服务器没有节流或其他问题,那么它应该更快。您是否尝试添加更多日志?我建议在每个等待下载之前添加它们。如果您能为playersListDataUpdate
函数提供一些工作示例,我将尝试自己运行它。不,它没有帮助。我真的不需要并行浏览名称,我需要的是并行下载每个名称中的图像。但不管我是使用队列还是在每次下载后同步三次下载,我都会得到同样的8分钟,这对我来说很奇怪。如果我删除所有下载,它将是30秒,如果我将添加一个下载,它将是2分钟,如果我添加两个以上的下载(无论同步或队列),它将是8分钟。我预计这将是大约2分钟,3下载在一个并行队列。