celery能更改负载均衡算法么?

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秒的任务完成之后,才开始处理

图片描述
图片描述

图片描述

阅读 4.6k
2 个回答

clipboard.png
两个worker,一个睡眠10000秒,这个执行的的确很慢。另一个玩得很开心啊,并没有阻塞。不知道你说的不会收到新任务是什么意思。
celery是可以判断worker的状态的,有任务会发给可以执行任务的worker。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题