如何保留多个独立的芹菜队列?

时间:2013-11-08 07:07:08

标签: python celery

我正在尝试在同一个redis数据库中保留多个不同任务和工作人员的芹菜队列。真的只是一个方便的问题,只需要一台redis服务器,而不是我的机器上的两台。

我按照芹菜教程文档逐字记录,因为它是让它为我工作的唯一方法。现在,当我尝试使用略微调整的名称/队列复制所有内容时,它会一直出错。

注意 - 我是Python和Celery的新手,这显然是问题的一部分。我不确定哪些部分被命名为“任务/任务”作为名称与特殊词语。

我的精简版文档: 运行celery -A tasks worker以生成工作人员。 tasks.py包含celery = Celery('tasks', broker='redis://localhost')的任务代码,用于连接到Celery和我想要延迟的函数@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'),
)

作为旁注,我不明白为什么celery worker错误与celery试图连接到默认的amqp实例,而celery -A tasks worker告诉芹菜连接到Redis。如果没有指定任何内容,celery worker尝试在worker上运行什么任务代码?

2 个答案:

答案 0 :(得分:49)

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

所以说你在do_work中有django_project_root/myapp/tasks.py任务功能。

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

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

然后使用celery worker -Q red运行一个worker,它只会处理该队列中的东西(另一个用celery worker调用的worker只会拾取默认队列中的东西)

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

答案 1 :(得分:13)

要动态链接到不同的队列,请按照以下步骤操作:

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

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)启动worker时,使用-Q指定队列名称'从中消耗的工作

celery -A proj worker -l info -Q queue1 
celery -A proj worker -l info -Q queue2
相关问题