Celery真的有好多实用的特性,譬如今天学习的速率限制Rate Limits:
我们在很多应用场景下可能需要对某些优先级不太高的任务进行限速,否则当此类任务产生的速度过快时,导致worker疲于奔命,从而导致高优先级的任务被饿死;此时Rate Limits就可以起作用了,我们可以给每个任务设置它们的rate limit,限制它们在一秒、一分或者一小时内能被每个worker处理的最大次数;
注意,rate limit是限制任务能被每个worker在某个时间间隔内处理的最大次数,一开始我以为可以限制任务在指定时间间隔内能被处理的最大次数(不论worker数量有多少),经过测试和看官方文档,发现并不是这样的!这两者的区别在于,如果rate limit为10/m,即每分钟10次,如果worker数量为n,那么每分钟内其实该任务可以被处理的最大次数为10n;如果我们希望不管worker数量为多少,该任务最多只能执行10次,那么通过rate limit是无法实现的!
我在测试过程中发现,rate limits的确有限速作用,但是好像精确度不够,譬如设置rate limits为10/m,单个worker在每分钟内执行该任务的次数可能超过10次,测试代码如下:
from celery import Celery
app = Celery('tasks',
backend='amqp://agent:agent@172.18.231.134:5672