停止芹菜工人处理任务或监控Flower中的“未消耗”任务

时间:2018-05-10 19:37:13

标签: python celery flower

假设芹菜队列上的所有任务都在点击第三方API。但是,API有一个速率限制,我正在跟踪(有一个限制和每小时限制,我需要尊重)。一旦达到速率限制,我想暂停新任务的消耗,然后在我知道自己很好的时候恢复。

我通过使用以下两个任务来实现这一目标:

InvoiceModel invoice = xml.Descendants("invoice")
    .Select(x => new InvoiceModel {
        InvoiceId = x.Element("id").Value.ToString(),
        InvoiceDate = x.Element("date").Value.ToString(),
        InvoiceAmount = x.Element("amount").Value.ToString()
    }).FirstOrDefault();
// Make sure that you get an invoice
if (invoice == null) {
    throw new InvalidOperationException("Invoice element does not exist in XML document.");
}

然后我可以继续提交我的第三方API任务,一旦我的消费者被添加回来,我的所有任务都会被消耗掉。大。

但是,由于此队列中没有消费者,因此似乎意味着我无法再查看Flower中提交的作业(直到我的消费者被添加)。

我做错了吗?我可以通过另一种方式实现这种“暂停”,让我继续看到提交的工作吗?

P.S。也许这与这个问题有关,但不是100%肯定:https://github.com/celery/celery/issues/1452

如果有所不同,我正在使用amqp broker。

感谢女孩和男孩。

1 个答案:

答案 0 :(得分:1)

我怀疑在工人拿起它们之前偷看队列消息的内容并不是Flower的预期设计的一部分。因此,如果您停止从队列中消耗任务,那么最好的Flower可以做的是向您显示在“Broker”窗格中将其中有多少列入单个数字。

观察传入任务内部的一种hackish方式可能是添加一个中间虚拟“转发”任务,该任务只是将消息从一个队列(我们称之为query_inbox)转发给另一个队列(例如, query_processing)。

E.g。类似的东西:

@celery.task(queue='query_inbox')
def query(params):
    process_query.delay(params)

@celery.task(queue='query_processing')
def process_query(params):
    ... do rate-limited stuff ...

现在您可以停止使用query_processing中的任务,但是当它们流过query_inbox工作人员时,您仍然可以观察他们的参数。