Параллельная загрузка изображений с URL внутри Promise.all - PullRequest
0 голосов
/ 06 марта 2020

Я работаю над сценарием, который берет список имен и для каждого загружает 3 изображения из URL. Чтобы взять каждое имя из массива, который я использую Promise.all, проблем пока нет. Но я хочу загрузить 3 изображения для игрока параллельно, чтобы сделать это быстрее, потому что мне нужно сделать это как можно быстрее. Таким образом, я вижу, что, если я загружаю только 1 изображение, потребуется ~ 2 минуты до go через все имена. Но если я добавлю еще 2 изображения для загрузки для игрока, я получу> 8 минут до go через все имена. Бот это нелогично, нет? Если я делаю 3 параллельных скачивания, то это должно иметь то же время, что и 1 загрузка (+/-). Что я делаю или считаю неправильным? Вот мой код, для параллельной загрузки я использую библиотеку Pqueue, для загрузки изображений image-downloader 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)
    };
}

1 Ответ

0 голосов
/ 06 марта 2020

Я полагаю, вы не возвращаете обещание от вашего map, поэтому ваш promise.all не имеет никаких обещаний для параллельного выполнения.

измените строку, где вы делаете addAll, чтобы вернуть обещание вместо решения. Как это

return queue.addAll([
....
]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...