Javascript 从Promise.all内的url并行下载图像

Javascript 从Promise.all内的url并行下载图像,javascript,node.js,promise,parallel-processing,Javascript,Node.js,Promise,Parallel Processing,我正在编写一个脚本,该脚本包含一个名称列表,每个名称从URL下载3个图像。要从数组中获取每个名称,我使用Promise.all,目前还没有问题。但我想为一个播放器并行下载3张图片,以加快速度,因为我需要以最快的方式完成。所以我看到,如果我只下载一张图片,需要大约2分钟来浏览所有的名字。但如果我再为一个玩家添加两张图片下载,我会在8分钟内浏览所有的名字。这是不合逻辑的,不是吗?如果我进行3次并行下载,它必须与1次下载具有相同的时间(+/-),我做了什么或认为错了什么?这是我的代码,对于并行下载,我

我正在编写一个脚本,该脚本包含一个名称列表,每个名称从URL下载3个图像。要从数组中获取每个名称,我使用Promise.all,目前还没有问题。但我想为一个播放器并行下载3张图片,以加快速度,因为我需要以最快的方式完成。所以我看到,如果我只下载一张图片,需要大约2分钟来浏览所有的名字。但如果我再为一个玩家添加两张图片下载,我会在8分钟内浏览所有的名字。这是不合逻辑的,不是吗?如果我进行3次并行下载,它必须与1次下载具有相同的时间(+/-),我做了什么或认为错了什么?这是我的代码,对于并行下载,我使用Pqueue库,用于图像下载图像下载程序npm lib

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下载在一个并行队列。