【问题标题】:How to keep multiple independent celery queues?如何保持多个独立的芹菜队列?
【发布时间】:2013-11-08 07:07:08
【问题描述】:

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

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

注意 - 我是 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 告诉 celery 连接到 Redis。如果未指定任何内容,celery worker 试图在 worker 上运行什么任务代码?

【问题讨论】:

    标签: python celery


    【解决方案1】:

    默认情况下,所有内容都进入一个名为 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 运行一个worker,它只会处理该队列中的东西(另一个使用celery worker 调用的worker 只会在默认队列中提取东西)

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

    【讨论】:

    • 我无法对此进行测试,但这听起来很合理。我最终重构了我的代码,以便将两个不同的任务概括为一个函数,这样我就可以将所有内容放在一个队列中。从代码管理的角度来看,这也是一个不错的决定。
    • 确保将 queue="red" 传递给 apply_sync 否则,尽管有这个 CELERY_ROUTES 设置,任务将被发送到默认的“celery”队列。当您使用 CELERY_ROUTES 时,我认为最好同时显式默认 CELERY_DEFAULT_QUEUE = 'celery' 设置(并且可能更改它而不是在 apply_async 中传递队列信息)。
    • @DominiquePERETTI 除非您在 CELERY_ROUTES 中没有正确引用任务名称,否则我从未见过这种行为。
    【解决方案2】:

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

    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 指定队列名称,从中消费作业

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

    【讨论】:

      猜你喜欢
      • 2019-09-03
      • 1970-01-01
      • 2018-02-22
      • 2016-01-28
      • 2014-06-09
      • 2017-08-15
      • 2014-01-26
      • 2020-02-01
      • 1970-01-01
      相关资源
      最近更新 更多