我正在使用 django 和 celery 编写一个构建服务器,它执行许多长任务。它运行在带有 centos 的 4 核服务器上。
最初,我使用默认的 django 代理 (BROKER_URL = 'django://'),它运行良好。但是我想要事件和监控,所以我尝试切换到 redis 或 rabbitmq。
redis 和 rabbitmq 都可以工作,因为它们最终会执行所有任务,但与 django broker 不同的是,它们有时只使用部分核心,有时甚至只使用 1 个(!),而其他核心闲置。
我想再次强调 django 代理总是正确地利用所有核心,为此我唯一改变的是代理。
我的配置是标准的(除了有两个队列):
CELERY_DEFAULT_QUEUE = 'default'
CELERY_QUEUES = (
Queue('default', routing_key='task.#'),
Queue('new_batches', routing_key='new_batch.#'),
)
CELERY_ACKS_LATE = True
CELERYD_PREFETCH_MULTIPLIER = 1
Django(完美)
BROKER_URL = 'django://'
Redis(错误)
BROKER_URL = 'redis://localhost:6379/0'
兔子( mustache )
BROKER_URL = 'amqp://user:pass@localhost:5672/scourge'
CELERY_BACKEND = "amqp"
CELERY_RESULT_BACKEND = "amqp"
CELERY_TASK_RESULT_EXPIRES = 60*60 * 24*7 # results expire after a week
知道为什么会这样吗?谢谢
请您参考如下方法:
尝试不同的配置后,-Ofair 开关解决了我的问题。
python manage.py celery worker -E -Ofair
我不确定底层机制到底是什么,或者是否有更正确的解决方案,但我很高兴它有效。
