我正在使用以下技术栈:
- Python 3.6
- Celery v4.2.1(Broker:RabbitMQ v3.6.0)
- Django v2.0.4。
根据Celery文档的说法,将定时任务运行在不同队列上应该很容易,只需要在CELERY_ROUTES中为任务定义相应的队列即可。然而,所有任务似乎都在Celery的默认队列上执行。
以下是my_app/settings.py上的配置:
CELERY_BROKER_URL = "amqp://guest:guest@localhost:5672//"
CELERY_ROUTES = {
'app1.tasks.*': {'queue': 'queue1'},
'app2.tasks.*': {'queue': 'queue2'},
}
CELERY_BEAT_SCHEDULE = {
'app1_test': {
'task': 'app1.tasks.app1_test',
'schedule': 15,
},
'app2_test': {
'task': 'app2.tasks.app2_test',
'schedule': 15,
},
}
这些任务只是用于测试路由的简单脚本:
文件app1/tasks.py:
文件app1/tasks.py:
from my_app.celery import app
import time
@app.task()
def app1_test():
print('I am app1_test task!')
time.sleep(10)
文件 app2/tasks.py:
from my_app.celery import app
import time
@app.task()
def app2_test():
print('I am app2_test task!')
time.sleep(10)
当我使用所有必需的队列运行Celery时:
celery -A my_app worker -B -l info -Q celery,queue1,queue2
RabbitMQ会显示只有默认队列"celery"在运行任务:
sudo rabbitmqctl list_queues
# Tasks executed by each queue:
# - celery 2
# - queue1 0
# - queue2 0
有人知道如何修复这种意外的行为吗?
谢谢,
CELERY_ROUTES
和CELERY_TASK_ROUTES
的区别解释:CELERY_ROUTES
是旧版 Celery 设置的名称,现在已被task_routes
取代。但是在 Django 设置文件中,Celery 设置必须使用大写字母(例如TASK_ROUTES
)。为了避免与其他 Django 设置冲突,建议使用CELERY_
前缀来设置 celery 配置,即使用CELERY_TASK_ROUTES
。要加载这些设置,可以使用以下方式:app.config_from_object('django.conf:settings', namespace='CELERY')
。因此,CELERY_TASK_ROUTES
只是新设置名称的大写和前缀修改。 - sparrowt