É possível limitar a execução paralela a um número/s?
Isso é necessário para esses serviços, como Limites e cotas da API do Google Sheet (consulte https://developers.google.com/analytics/devguides/config/mgmt/v3/limits-quotas) , que limitam o número de consultas por segundo ( QPS) por IP.
Obrigado!
Recursos semelhantes foram questionados antes. ( #1113 #1082 #1020 #942 #37 ) Há demanda por algum tipo de funcionalidade de "fila limitada", mas gerenciar esse tipo de construção corretamente é um problema difícil.
Esse é o tipo de coisa para as quais as pessoas usam bibliotecas e sistemas de filas de mensagens dedicados.
tl;dr you/async precisaria de algum tipo de função de suavização para fazer isso. Se fôssemos fazer isso, provavelmente implementaríamos uma função de suavização exponencial em um token bucket .
Se alguém estiver interessado em trabalhar nisso, avise-nos :)
OP: talvez você já tenha resolvido isso ..... Eu usei outro pacote NPM para implementar a limitação de taxa usando modelos leakybucket ou token bucket. https://www.npmjs.com/package/limiter Isso funcionou bem para mim no passado. Para criar uma função de mapeador de taxa limitada, faça algo assim. Sua função de mapeador é usada diretamente com 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
});
Isso parece uma lib que devemos mencionar em nosso readme. Parece fazer o que queríamos construir.
Sim, está usando um token bucket sob o capô, que é a mesma abordagem que eu estava tomando. Eu ficaria muito bem adiando a limitação de taxa para bibliotecas externas :)
Sim, honestamente, eu não ficaria feliz em ter que apoiar algo assim dentro do Async. Há tantas pegadinhas ao fazer a limitação de taxa.
Alterando as tags para significar que precisamos de um lugar nos documentos para outras bibliotecas que estendem o Async.
Outra maneira de fazer isso usando Promise.all e promise-throttle:
Comentários muito úteis
OP: talvez você já tenha resolvido isso ..... Eu usei outro pacote NPM para implementar a limitação de taxa usando modelos leakybucket ou token bucket. https://www.npmjs.com/package/limiter Isso funcionou bem para mim no passado. Para criar uma função de mapeador de taxa limitada, faça algo assim. Sua função de mapeador é usada diretamente com async.