芹菜工人:如何从所有队列消费?

时间:2014-09-30 10:27:01

标签: python celery

我有

  • 设置CELERY_CREATE_MISSING_QUEUES = True
  • 未定义CELERY_QUEUES
  • 定义CELERY_DEFAULT_QUEUE = 'default'(直接类型)
  • 一个自定义路由器类,可以动态创建路由,如图所示 这张票(https://github.com/celery/celery/issues/150)。

我看到自定义路由器返回的路由中的新队列已创建,我认为这是因为CELERY_CREATE_MISSING_QUEUES

现在,在我运行的工作节点中,我没有通过-Q参数,它仅使用'默认值'队列似乎与文档一致 -

  

默认情况下,它将使用中定义的所有队列   CELERY_QUEUES设置(如果未指定,则默认为队列   命名芹菜)。

有没有办法让我的worker节点从包括动态创建的所有队列中消耗?

谢谢,

1 个答案:

答案 0 :(得分:5)

工作人员需要被告知这些自动或动态创建的队列,因此您需要一种方法来获取这些队列名称并在创建它们时存储它们,或者如果您正在使用它们可能来自rabbitmqctl list_queues RabbitMQ作为代理,例如添加一个信号处理程序,将这些动态队列添加到工作人员中以供消费。

例如使用celeryd_after_setup信号:

from celery.signals import celeryd_after_setup

@celeryd_after_setup.connect
def add_dynamic_queue(sender, instance, **kwargs):
    # get the dynamic queue, maybe stored somewhere
    queue = 'dynamic_queue'
    instance.app.amqp.queues.select_add(queue)

如果始终创建新的动态队列,您还可以命令工作人员在运行时使用以下命令开始使用这些队列:

#command all workers to consume from the 'dynamic_queue' queue
app.control.add_consumer('dynamic_queue', reply=True)

# command specific workers
app.control.add_consumer('dynamic_queue', reply=True, destination=[w1@example])

请参阅Adding Consumers

我希望这会有所帮助,当我获得有关此内容的更多信息时,我会编辑问题。