Async: 具有 n/sec 限制的 mapLimit

创建于 2016-10-27  ·  8评论  ·  资料来源: caolan/async

是否可以将并行执行限制为数/秒?
这对于那些限制每秒查询数的服务来说是必要的,例如 Google Sheet API 限制和配额(请参阅 https://developers.google.com/analytics/devguides/config/mgmt/v3/limits-quotas)( QPS)每个 IP。
谢谢!

docs feature wont fix

最有用的评论

OP:也许你已经解决了这个问题.....我使用了另一个 NPM 包来实现使用leakybucket 或令牌桶模型的速率限制。 https://www.npmjs.com/package/limiter这在过去对我来说效果很好。 要创建速率限制映射器功能,只需执行以下操作。 您的映射器函数直接与异步一起使用。

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
 });

所有8条评论

之前已经询问过类似的功能。 ( #1113 #1082 #1020 #942 #37 ) 需要某种“节流队列”功能,但正确管理这种结构是一个难题。

这就是人们使用专用消息队列库和系统的目的。

tl; dr you/async 需要某种平滑功能来做到这一点。 如果我们这样做,我们可能会在令牌桶中实现指数平滑函数

如果有人对此感兴趣,请告诉我们:)

OP:也许你已经解决了这个问题.....我使用了另一个 NPM 包来实现使用leakybucket 或令牌桶模型的速率限制。 https://www.npmjs.com/package/limiter这在过去对我来说效果很好。 要创建速率限制映射器功能,只需执行以下操作。 您的映射器函数直接与异步一起使用。

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
 });

这似乎是我们应该在自述文件中提到的一个库。 似乎在做我们想做的事。

是的,它在引擎盖下使用了一个令牌桶,这与我采用的方法相同。 我会很好地将速率限制推迟到外部库:)

是的,老实说,我不会对在 Async 中支持类似的东西感到兴奋。 进行速率限制时有很多陷阱。

更改此标签以表示我们需要在文档中为扩展 Async 的其他库提供一个位置。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

pcman312 picture pcman312  ·  8评论

ghost picture ghost  ·  9评论

rumkin picture rumkin  ·  22评论

aearly picture aearly  ·  10评论

caub picture caub  ·  12评论