我正在使用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监控整个应用程序,我可以看到子任务是成功完成的。芹菜如何发现这种状态?我浏览了他们的代码,却无法知道他们是如何进行检测的。
答案 0 :(得分:3)
我的主要任务现在应该等到子任务结束。
你永远不应该等待子任务,因为这可能导致资源匮乏和死锁(所有 等待另一个任务的任务,但没有更多的工人来处理它们。)
相反,您应该在子任务完成后使用回调来执行其他操作 (请参阅Celery用户指南中的Canvas指南)。
我正在使用Celery Flower监控整个应用程序,我可以看到子任务是 successfuelly完成。芹菜如何发现这种状态?我浏览了他们的代码,但却没有 了解他们如何进行检测。
花和其他监视器不使用结果(任务状态),而是使用我们称之为事件。
当工作程序中发生某些操作时会发出事件消息,这将成为一个短暂的消息流。进程可以订阅某些事件(或所有事件)来监视集群。
事件与任务状态是分开的,因为
事件不是持久性的(瞬态)
错过任何事件不被视为严重失败。
复杂字段未序列化
事件仅用于诊断和信息目的,不应使用
内省任务返回值或异常
例如,因为只存储了这些repr()
以确保监视器
可以用其他语言编写,并且可以截断大字段以确保
传输速度更快。