设置多个任务的芹菜限度

问题描述 投票:1回答:1
@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。这取决于请求的任务的速度。但是,在一秒钟内只能完成两个任务之一。

python celery mq
1个回答
0
投票

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_api1get_github_api2将具有1个速率限制

© www.soinside.com 2019 - 2024. All rights reserved.