Skip to main content
 首页 » 编程设计

python之使用 redis 或 rabbitmq 时,Celery 不会利用所有内核

2025年05月04日27kuangbin

我正在使用 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 

我不确定底层机制到底是什么,或者是否有更正确的解决方案,但我很高兴它有效。