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

jwo*_*oww 31 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()
Run Code Online (Sandbox Code Playgroud)

因此,鉴于上述所有内容,我需要采取哪些步骤将其转换为在不同队列和工作人员上独立运行的两种类型的任务?例如,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'),
)
Run Code Online (Sandbox Code Playgroud)

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

dbr*_*dbr 51

默认情况下,一切都进入一个名为的默认队列celery(celery worker如果没有指定队列,这将处理)

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

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

CELERY_ROUTES = {
    'myproject.tasks.do_work': {'queue': 'red'},
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 确保将queue ="red"传递给apply_sync,否则,尽管有此CELERY_ROUTES设置,该任务将被发送到默认的"celery"队列.当您使用CELERY_ROUTES时,我认为最好还要显式默认CELERY_DEFAULT_QUEUE ='celery'设置(并且可能更改它而不是在apply_async中传递队列信息). (3认同)

jos*_*kal 17

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

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

celery.send_task('job1', args=[], kwargs={}, queue='queue_name_1')
celery.send_task('job1', args=[], kwargs={}, queue='queue_name_2')
Run Code Online (Sandbox Code Playgroud)

(这里一个特定的工作使用两个队列)

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

CELERY_CREATE_MISSING_QUEUES = True
Run Code Online (Sandbox Code Playgroud)

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

celery -A proj worker -l info -Q queue1 
celery -A proj worker -l info -Q queue2
Run Code Online (Sandbox Code Playgroud)