@app.task(rate_limit='1/s')
def task1():
print ('hi')
@app.task(rate_limit='1/s')
def task2():
print ('hello')
此代码将打印1嗨/秒和1你好/秒。这不是我想要的。我想让它打印1(hi + hello)/ sec,这意味着不对每个任务都设置速率限制,而是对多个任务设置速率限制。
它可以是(0.5 hi + 0.5 hello)/ sec或(0.7 hi + 0.3 hello)/ sec。这取决于请求的任务的速度。但是,在一秒钟内只能完成两个任务之一。
Celery的此选项无法正常工作:您需要为每个工作人员设置速率限制,以满足全局限制。尝试基于令牌桶算法的解决方案。在这里您可以找到实现:celery throttling settings rate limit on queue
您只需要RabbitMQ(也可以使用其他经纪人)和celerybeat。 RabbitMQ存储带有令牌的队列,而celerybeat负责发出令牌。配置完成(大约30行代码)后,您可以像这样使用它:
# per minute rate
rate_limits = {
'github': 60,
'google': 100
}
@app.task(bind=True, max_retries=None)
@rate_limit('github')
def get_github_api1(self):
print ('Called github Api 1')
@app.task(bind=True, max_retries=None)
@rate_limit('github')
def get_github_api2(self):
print ('Called github Api 2')
[get_github_api1
和get_github_api2
将具有1个速率限制