【发布时间】:2016-04-19 22:52:54
【问题描述】:
我有一台运行同一个 Django 项目的两个副本的机器,我们称它们为 A 和 B,我想使用 Celery 来处理后台任务。
我设置主管启动两个工作人员,每个项目一个,但鉴于两个项目中的任务名称相同,有时任务由错误的工作人员运行。
我的下一步是使用-Q queueName 参数为每个工人使用不同的队列。使用rabbitmqctl list_queues 我可以看到两个队列都已创建。我用来发布工人的命令是
python3 -m celery worker -A project -l INFO -Q q1 --hostname=celery1@ubuntu
和
python3 -m celery worker -A project -l INFO -Q q2 --hostname=celery2@ubuntu
问题是,我如何将所有任务从 project A 路由到 queue A,并将所有任务从 project B 路由到 队列B?是的,我看到您可以向 task 装饰器添加一个参数来选择队列,但我正在寻找一个全局设置或类似的东西。
编辑 1:我尝试使用 CELERY_DEFAULT_QUEUE,但它不起作用,设置被忽略。我也尝试过创建一个哑路由器,如下所示:
class MyRouter(object):
def route_for_task(self, task, args=None, kwargs=None):
return 'q1'
CELERY_ROUTES = (MyRouter(), )
而且它有效(显然在每个项目中返回不同的队列),但我很困惑,为什么 CELERY_DEFAULT_QUEUE 设置被忽略了?
【问题讨论】: