40

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

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

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

我的精简版文档:Run celery -A tasks workerto spawn the workers。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 workercelery 尝试连接到默认 amqp 实例时出错,同时celery -A tasks worker告诉 celery 连接到 Redis。celery worker如果未指定任何内容,则尝试在工作人员上运行什么任务代码?

4

2 回答 2

63

默认情况下,所有内容都进入一个名为的默认队列(如果未指定队列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,它只会处理该队列中的东西(另一个调用的工作人员celery worker只会在默认队列中拾取东西)

文档中的任务路由部分应该解释所有内容。

于 2014-01-24T09:21:15.220 回答
29

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

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)在启动worker时,使用-Q指定队列名称'从哪个jobs被消耗

celery -A proj worker -l info -Q queue1 
celery -A proj worker -l info -Q queue2
于 2017-05-11T20:28:27.033 回答