Есть ли предел тому, сколько обещаний может или должно выполняться одновременно? - PullRequest
0 голосов
/ 08 января 2019

Удивительно, но Google не смог вернуть результат по этому вопросу.

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

Если он основан на интернет-провайдере / типе соединения пользователя, есть ли способ проверить идеальное количество обещаний, которые нужно отправить перед началом очереди?

Кроме того, я говорю строго со стороны клиента. Итак, один поток JS.

Пример кода:

    function uploadToServer(requestData){
    return Promise((...));
   }

 function sendRequests(requestArray){
    var count = 0;
    for(var requestData in requestArray){
        if(count<idealAmount){
            uploadToServer(idealAmount).then(count--);
            count++;
       }else{
           // Logic to wait before attempting to fire event
       }

   }
 }

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Как уже упоминалось @ jfried00, не может быть никаких ограничений на количество выполняемых обещаний, так как не существует такой вещи, как запуск Promise. После запуска async function или кода, подобного new Promise(res => something(res)), метод запускается.

Что вы можете сделать, это ограничить число разрешаемых цепочек обещаний:

// ten promises ago:
let oldPromise = doSomethingAsync();

// and now:
oldPromise.then(doSomethingNewAsync());

Но на самом деле собственное кодирование будет довольно быстро окрашивать волосы в серый цвет, как показал мой пример - обработка ошибок, поиск пустых слотов и поддержание потока в правильном порядке будет трудным.

Сказал, что это возможно, и мой фреймворк, Scramjet , который я безбожно вставлю сюда, делает то, что вам нужно:

DataStream.from(requestArray)
    .setOptions({maxParallel: 4})
    .unorder(requestData => uploadToServer(requestData))
    .run()

Scramjet сохранит разрешение четырех обещаний, но не будет пытаться поддерживать порядок (для этого есть другие методы), и вы можете использовать любую функцию - если она не возвращает обещание, она будет работать так же, как если бы она это сделала , Вот еще немного текста о неупорядоченных преобразованиях в scramjet . Вы также можете посмотреть исходный код, если хотите сделать это самостоятельно ...

0 голосов
/ 09 января 2019

Сами обещания не имеют особых кодированных ограничений. Они просто система уведомлений, и вы могли бы иметь миллионы из них просто отлично (если у вас было достаточно памяти для хранения этих объектов Javascript).

Теперь, если обещание представляет лежащую в основе асинхронную операцию (что они обычно делают), вполне могут быть некоторые ограничения на то, сколько из этого конкретного типа асинхронной операции может выполняться одновременно. Например, в какой-то момент вы можете столкнуться с ограничением количества запросов, которые один хост будет принимать от вас одновременно. Или вы можете столкнуться с проблемами с локальными ресурсами из-за миллиардов соединений.

Для таких операций, как операции ввода-вывода диска node.js, в базовой подсистеме ввода-вывода диска уже имеется система очередей, так что на самом деле одновременно выполняется только небольшое количество операций, а остальные находятся в очереди.

Итак, чтобы ответить на вопрос о том, сколько параллельных операций вы можете выполнить, он может быть проанализирован и получен ответ только в контексте определенного типа асинхронного запроса и иногда даже определенного типа принимающего хоста.

Если вы знаете, что обрабатываете большой или потенциально большой массив запросов, и вы будете отправлять сетевой запрос для каждого элемента в массиве, то обычно кодируют ограничение самостоятельно, чтобы избежать перегрузки либо локальных ресурсов, либо целевые ресурсы хоста. Обычно это делается не с помощью очереди, а с помощью кода, который просто запускает N запросов, а затем, по окончании одного, запускает следующий и так далее. В библиотеках Bluebird и Async есть методы для управления этим за вас. В Bluebird это опция concurrency для Promise.map(). Я также сам вручную кодировал циклы, которые несколько раз управляют количеством одновременных соединений, и вот ссылки на этот код:

Promise.all потребляет всю мою оперативную память

Javascript - как контролировать количество обещаний доступа к сети параллельно

Сделайте несколько запросов к API, который может обрабатывать только 20 запросов в минуту

Цикл запроса API с переменным URL

Выберите правильный асинхронный метод для пакетной обработки для максимальных запросов / сек

Nodejs: асинхронный запрос со списком URL

...