如何保持多个独立的芹菜排队?

2024-04-16 15:02:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在同一个redis数据库中保留多个具有不同任务和工作者的芹菜队列。实际上只是一个方便的问题,我的机器上只需要一个redis服务器而不是两个。

我一字不差地遵循芹菜教程文档,因为这是让它为我工作的唯一方法。现在,当我尝试用稍微调整过的名称/队列复制所有内容时,它会一直出错。

注意-我对Python和芹菜很陌生,这显然是问题的一部分。我不确定哪些部分被命名为“task/tasks”作为名称和特殊单词。

我的文档压缩版本: 运行celery -A tasks worker生成工作进程。 tasks.py包含任务代码,celery = Celery('tasks', broker='redis://localhost')用于连接芹菜,以及位于我要延迟的函数上方的@task()

在我的任务排队程序中。。。

from tasks import do_work
do_work.delay()

因此,考虑到上述所有情况,我需要采取哪些步骤才能将其转换为在单独队列和工作线程上独立运行的两种类型的任务?例如,蓝色任务和红色任务?

我已尝试将所有任务实例更改为蓝色任务或红色任务。但是,当我将蓝色任务排队时,我启动的红色任务工作人员开始尝试处理它们。

我读到了默认队列之类的内容,所以我尝试了这段代码,但没有成功:

CELERY_DEFAULT_QUEUE = 'red'
CELERY_QUEUES = (
    Queue('red', Exchange('red'), routing_key='red'),
)

顺便说一下,我不明白为什么芹菜试图连接到默认的amqp实例时会出错,而告诉芹菜连接到Redis。如果未指定任何内容,则celery worker试图在工作进程上运行的任务代码是什么?


Tags: 代码文档名称redis内容task队列进程
2条回答

默认情况下,所有内容都进入一个名为celery的默认队列(如果未指定队列,这就是celery worker将处理的内容)

假设你在django_project_root/myapp/tasks.py中有你的do_work任务函数。

您可以将do_work任务配置为位于它自己的队列中,如下所示:

CELERY_ROUTES = {
    'myproject.tasks.do_work': {'queue': 'red'},
}

然后使用celery worker -Q red运行一个工作进程,它将只处理该队列中的事物(使用celery worker调用的另一个工作进程将只拾取默认队列中的事物)

文档中的task routing部分应该解释所有内容。

要动态链接到不同的队列,请执行以下步骤:

1)用'queue'属性指定队列的名称

celery.send_task('job1', args=[], kwargs={}, queue='queue_name_1')
celery.send_task('job1', args=[], kwargs={}, queue='queue_name_2')

(此处特定作业使用两个队列)

2)在配置文件中添加以下条目

CELERY_CREATE_MISSING_QUEUES = True

3)启动工作进程时,使用-Q指定要从中使用作业的队列名称

celery -A proj worker -l info -Q queue1 
celery -A proj worker -l info -Q queue2

相关问题 更多 >