芹菜:具有相同参数的任务的速率限制

Ant*_*nel 7 python rate-limiting ratelimit celery

我正在寻找一种限制何时调用函数的方法,但仅当输入参数不同时,即:

@app.task(rate_limit="60/s")
def api_call(user):
   do_the_api_call()

for i in range(0,100):
  api_call("antoine")
  api_call("oscar")
Run Code Online (Sandbox Code Playgroud)

所以,我想api_call("antoine")被称为每秒60次api_call("oscar") 每秒60次为好.

有什么帮助,我该怎么办?

--EDIT 27/04/2015我尝试在任务中调用带有rate_limit的子任务,但它也不起作用:rate_limit总是应用于所有实例化的子任务或任务(这是逻辑的).

@app.task(rate_limit="60/s")
def sub_api_call(user):
   do_the_api_call()

@app.task
def api_call(user):
  sub_api_call(user)

for i in range(0,100):
  api_call("antoine")
  api_call("oscar")
Run Code Online (Sandbox Code Playgroud)

最好!

Erv*_*879 0

我认为使用 Celery 的内置任务限制器不可能实现这一点。

假设您正在为 API 使用某种缓存,最好的解决方案可能是创建任务名称和参数的哈希值,并将该密钥用于基于缓存的节流器。

如果您使用 Redis,则可以设置 60 秒超时的锁定,或使用增量计数器来计算每分钟的调用次数。

这篇文章可能会为您提供一些有关使用 Redis 对 Celery 任务进行分布式节流的指导:

https://callhub.io/distributed-rate-limiting-with-redis-and-celery/