2013-05-03 69 views
0

我遇到了一个用例,我想控制芹菜工作人员如何以及何时从rabbitmq处理任务以进行处理。离职将与芹菜背景下发生的外部事件同步,但我担心芹菜是否给我任何灵活性来控制任务的出队?我试图调查及以下几种可能性:从基于外部事件(事件队列)的队列中消费

  • 利用basic.get代替basic.consume,其中basic.get基于外部事件触发。但是,我看到芹菜默认为basic.consume(推)语义。我可以在不直接修改内核的情况下重写此行为吗?

  • 自定义远程控制外部事件触发时的工作人员。但是,从文档来看,我不太清楚远程控制命令如何帮助我控制任务的出队。

我非常想继续使用芹菜,并可能远离在AMQP上编写自定义队列处理解决方案。

回答

0

使用远程控制命令,您可以从给定队列消耗pause or resume消息。

celery.control.cancel_consumer('celery') 

上面的命令指示的所有工人停止食用从默认芹菜队列(出列)消息

celery.control.add_consumer('celery') 

远程命令接受目的地参数,它允许发送到特定工人的请求

+0

感谢您的意见。遥控命令的确看起来像是一个合理的选择。但是,看起来像工作人员仍然会使用'prefetch_count> 1'来执行任务,这种做法会打败我的目的。有没有办法通过'prefetch_count = 1'来启用这些消费者?具体来说,我想要a)添加使用者b)从指定的队列中取出单个任务c)禁用该队列的使用者,直到进一步发生外部事件 – 2013-05-04 17:20:41

+0

为工作者配置预取计数CELERYD_PREFETCH_MULTIPLIER = 1 – mher 2013-05-05 09:46:13

0

另外两个需要考虑的奇特选项:(1)在兔子层中定义一个自定义交换类型。这允许您创建路由规则来控制哪些任务发送到哪些队列。 (2)定义一个定制的芹菜介体。这允许您控制从队列到工作池的哪些任务移动。