Можно ли ограничить параллельное выполнение числом в секунду?
Это необходимо для таких сервисов, как лимиты и квоты Google Sheet API (см. https://developers.google.com/analytics/devguides/config/mgmt/v3/limits-quotas), которые ограничивают количество запросов в секунду ( QPS) на IP-адрес.
Спасибо!
О подобных функциях уже спрашивали. ( # 1113 # 1082 # 1020 # 942 # 37 ) Существует спрос на некоторую функциональность «регулируемой очереди», но правильное управление такой конструкцией является сложной проблемой.
Это то, для чего люди используют специальные библиотеки и системы очередей сообщений.
tl;dr you/async для этого понадобится какая-то функция сглаживания. Если бы мы сделали это, мы, вероятно, реализовали бы функцию экспоненциального сглаживания a tokenbucket .
Если кто-то заинтересован в работе над этим, дайте нам знать :)
ОП: может быть, вы уже решили эту проблему… Я использовал другой пакет NPM для реализации ограничения скорости с использованием моделей дырявого ведра или токена. https://www.npmjs.com/package/limiter Раньше у меня это хорошо работало. Чтобы создать функцию сопоставления с ограниченной скоростью, просто сделайте что-то вроде этого. Ваша функция сопоставления напрямую используется с async.
var RateLimiter = require("limiter").RateLimiter;
var limiter = new RateLimiter(2, "second");
var async = require('async');
function rateLimitedMapper(item, callback)
{
limiter.removeTokens(1, function(err, remainingRequests) {
console.log("working on item: " + item);
callback(null, item.length);
});
}
async.map(input, rateLimitedMapper, function(err, results) {
// do something with results
});
Это похоже на библиотеку, которую мы должны упомянуть в нашем файле readme. Кажется, он делает то, что мы хотели построить.
Да, он использует ведро токенов под капотом, и это тот же подход, который я использовал. Я был бы вполне в порядке, если бы отложил ограничение скорости для внешних библиотек :)
Да, если честно, я бы не был в восторге от поддержки чего-то подобного в Async. Есть так много ошибок при ограничении скорости.
Изменение тегов для обозначения того, что нам нужно место в документах для других библиотек, расширяющих Async.
Другой способ сделать это с помощью Promise.all и promise-throttle:
Самый полезный комментарий
ОП: может быть, вы уже решили эту проблему… Я использовал другой пакет NPM для реализации ограничения скорости с использованием моделей дырявого ведра или токена. https://www.npmjs.com/package/limiter Раньше у меня это хорошо работало. Чтобы создать функцию сопоставления с ограниченной скоростью, просто сделайте что-то вроде этого. Ваша функция сопоставления напрямую используется с async.