gpt4 book ai didi

django - Celery,将Django项目中的所有任务路由到特定队列

转载 作者:行者123 更新时间:2023-12-04 00:10:27 25 4
gpt4 key购买 nike

我有一台机器运行同一个 Django 项目的两个副本,我们称它们为 AB,我想使用 Celery 来处理后台任务。

我设置了 supervisor 来启动两个 worker,每个项目一个,但是鉴于两个项目中的任务名称相同,有时任务由错误的 worker 运行。

我的下一步是使用 -Q queueName 参数为每​​个工作人员使用不同的队列。使用 rabbitmqctl list_queues 我可以看到两个队列都已创建。我用来发出 worker 的命令是

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

问题是,如何将项目A中的所有任务路由到队列A,并将项目B中的所有任务路由到< em>队列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 设置被忽略了?

最佳答案

最后比我预期的要容易。我只需要设置默认队列和默认路由键(以及可选的默认交换,只要它是直接交换)。

CELERY_DEFAULT_QUEUE = 'q2'
CELERY_DEFAULT_EXCHANGE = 'q2'
CELERY_DEFAULT_ROUTING_KEY = 'q2'

我有一些概念不清楚,但是在遵循official RabbitMQ's tutorials之后他们变得更加清晰,我能够解决问题。

关于django - Celery,将Django项目中的所有任务路由到特定队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36730858/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com