CELERYD_OPTS="--concurrency=8" ,实际观察中发现,celery应该采用的是轮询.当新任务来的时候, 每次都会按照固定的顺序执行任务,记为1,2,3,4,5,6,7,8.那么假如5号上面的任务执行很慢,那么即使6,7,8上面已经处于空闲状态了,还是不会接收到新任务.
有没有什么办法可以优化celery取任务的算法?是从celery下手还是broker?
附上测试内容:
tasks.py
# coding:utf8
from celery import Celery
import time
import logging
import arrow
logging.basicConfig(level=logging.DEBUG)
LOG = logging.getLogger()
app = Celery('tasks', broker='amqp://guest@localhost//')
@app.task
def add(ti, x, y):
temp_t = arrow.now()
LOG.info("start:%s" % temp_t)
time.sleep(ti)
LOG.info("end :%s " % temp_t)
return x + y
if __name__ == '__main__':
for i in range(1000):
print add.delay(1, 4, 5)
celery shell:
>> from tasks import add
>> add.delay(200, 4, 5)
然后执行python tasks.py
结果如下:
跑掉了49个任务,然后发生了阻塞,直到delay200秒的任务完成之后,才开始处理
两个worker,一个睡眠10000秒,这个执行的的确很慢。另一个玩得很开心啊,并没有阻塞。不知道你说的不会收到新任务是什么意思。
celery是可以判断worker的状态的,有任务会发给可以执行任务的worker。