Python Celery Task没有后端完成

时间:2013-01-11 12:10:30

标签: python celery celery-task

我正在使用Celery 3.0.12。

我有两个队列:Q1,Q2。

总的来说,我将主要任务放在Q1中,然后调用第二季度的子任务。 我不想为子任务存储任何结果。所以我的子任务有装饰器@ celery.task(ignore_results = True)。

我的主要任务现在应该等到子任务完成。因为我没有写任何结果。我不能使用:AsyncResult。有没有办法在主任务中等待,直到子任务完成而不将状态存储到后端。我对AsyncResults的所有尝试都不是成功的(它依赖于后端)。似乎get()依赖于后端。

代码中的整个故事:

@celery.task(ignore_result=True)
def subtask():
   #Do something

@celery.task
def maintask():
    # Do something

    # Call subtask on Q2:
    res = subtask(options={'queue':'Q2'}).delay()

    # Need to wait till subtask finishes
    # NOT WORKING (DOES NEVER RETURN)
    res.get()

我正在使用Celery Flower监控整个应用程序,我可以看到子任务是成功完成的。芹菜如何发现这种状态?我浏览了他们的代码,却无法知道他们是如何进行检测的。

1 个答案:

答案 0 :(得分:3)

  

我的主要任务现在应该等到子任务结束。

你永远不应该等待子任务,因为这可能导致资源匮乏和死锁(所有 等待另一个任务的任务,但没有更多的工人来处理它们。)

相反,您应该在子任务完成后使用回调来执行其他操作 (请参阅Celery用户指南中的Canvas指南)。

  

我正在使用Celery Flower监控整个应用程序,我可以看到子任务是   successfuelly完成。芹菜如何发现这种状态?我浏览了他们的代码,但却没有   了解他们如何进行检测。

花和其他监视器不使用结果(任务状态),而是使用我们称之为事件

当工作程序中发生某些操作时会发出事件消息,这将成为一个短暂的消息流。进程可以订阅某些事件(或所有事件)来监视集群。

事件与任务状态是分开的,因为

  • 事件不是持久性的(瞬态)

    错过任何事件不被视为严重失败。

  • 复杂字段未序列化

    事件仅用于诊断和信息目的,不应使用 内省任务返回值或异常 例如,因为只存储了这些repr()以确保监视器 可以用其他语言编写,并且可以截断大字段以确保 传输速度更快。