我试图在同一个 redis 数据库中保留多个具有不同任务和工人的芹菜队列。真的只是一个方便的问题,只需要一个 redis 服务器而不是我的机器上的两个。
我逐字逐句地遵循了芹菜教程文档,因为它是让它为我工作的唯一方法。现在,当我尝试使用稍作调整的名称/队列复制所有内容时,它会不断出错。
注意 - 我是Python和Celery的新手,这显然是问题的一部分。我不确定哪些部分被命名为"任务/任务"作为名称与特殊单词。
我的精简版文档:运行celery -A tasks worker
以生成工人。tasks.py 包含任务代码,其中包含连接到 Celery 的celery = Celery('tasks', broker='redis://localhost')
,并在我想要延迟的函数上方@task()
。
在我的排队任务程序中...
from tasks import do_work
do_work.delay()
因此,鉴于上述所有内容,我需要采取哪些步骤才能将其转换为在单独的队列和工作线程上独立运行的两种类型的任务?例如,blue_tasks和red_tasks?
我尝试将所有任务实例更改为blue_tasks或red_tasks。但是,当我排队blue_tasks时,我启动的red_tasks工人开始尝试处理它们。
我读到了默认队列等,所以我尝试了这段代码,但没有用:
CELERY_DEFAULT_QUEUE = 'red'
CELERY_QUEUES = (
Queue('red', Exchange('red'), routing_key='red'),
)
作为旁注,我不明白为什么芹菜尝试连接到默认的 amqp 实例时celery worker
错误,而celery -A tasks worker
告诉芹菜连接到 Redis。如果未指定任何内容,celery worker
尝试在辅助角色上运行什么任务代码?
默认情况下,所有内容都进入名为 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
调用的工作线程只会在默认队列中拾取内容)
文档中的任务路由部分应解释所有内容。
要动态链接到不同的队列,请执行以下步骤:
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