Async: mapLimit avec limite n/sec

Créé le 27 oct. 2016  ·  8Commentaires  ·  Source: caolan/async

Est-il possible de limiter l'exécution parallèle à un nombre/sec ?
Cela est nécessaire pour ces services, comme Google Sheet API Limits and Quotas (voir https://developers.google.com/analytics/devguides/config/mgmt/v3/limits-quotas) , qui limitent le nombre de requêtes par seconde ( RPS) par IP.
Merci!

docs feature wont fix

Commentaire le plus utile

OP : peut-être avez-vous déjà résolu ce problème... J'ai utilisé un autre package NPM pour implémenter la limitation de débit à l'aide de modèles leakybucket ou token bucket. https://www.npmjs.com/package/limiter Cela a bien fonctionné pour moi dans le passé. Pour créer une fonction de mappeur à débit limité, faites simplement quelque chose comme ça. Votre fonction de mappeur est directement utilisée avec 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
 });

Tous les 8 commentaires

Des fonctionnalités similaires ont déjà été posées. ( #1113 #1082 #1020 #942 #37 ) Il existe une demande pour une sorte de fonctionnalité de "file d'attente limitée", mais gérer correctement ce type de construction est un problème difficile.

C'est le genre de choses pour lesquelles les gens utilisent des bibliothèques et des systèmes de file d'attente de messages dédiés.

tl;dr you/async aurait besoin d'une sorte de fonction de lissage pour ce faire. Si nous devions faire cela, nous implémenterions probablement une fonction de lissage exponentielle a token bucket .

Si quelqu'un est intéressé à travailler dessus, faites-le nous savoir :)

OP : peut-être avez-vous déjà résolu ce problème... J'ai utilisé un autre package NPM pour implémenter la limitation de débit à l'aide de modèles leakybucket ou token bucket. https://www.npmjs.com/package/limiter Cela a bien fonctionné pour moi dans le passé. Pour créer une fonction de mappeur à débit limité, faites simplement quelque chose comme ça. Votre fonction de mappeur est directement utilisée avec 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
 });

Cela semble être une bibliothèque que nous devrions mentionner dans notre fichier readme. Semble faire ce que nous voulions construire.

Oui, il utilise un seau à jetons sous le capot, ce qui est la même approche que j'adoptais. Je serais très bien de reporter la limitation de débit aux bibliothèques externes :)

Ouais, honnêtement, je ne serais pas ravi de devoir prendre en charge quelque chose comme ça au sein d'Async. Il y a tellement de pièges lors de la limitation du débit.

Changer les balises à ce sujet pour signifier que nous avons besoin d'une place dans la documentation pour les autres bibliothèques qui étendent Async.

Cette page vous a été utile?
0 / 5 - 0 notes