gpt4 book ai didi

Python Celery 任务在没有后端的情况下完成

转载 作者:太空宇宙 更新时间:2023-11-03 11:07:57 24 4
gpt4 key购买 nike

我正在使用 Celery 3.0.12。

我有两个队列:Q1、Q2。

一般来说,我将主要任务放在 Q1 中,然后调用 Q2 中的子任务。我不想存储子任务的任何结果。所以我的子任务有装饰器@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 监控整个应用程序,我可以看到子任务正在成功完成。 Celery 如何检测到该状态?我浏览了他们的代码,但无法了解他们是如何进行检测的。

最佳答案

My main task should now wait until the subtask has finished.

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

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

I'm monitoring the whole application with Celery Flower and I can see that subtask is successfuelly finishing. How can Celery detect that state? I browsed their code but couldn't find out how they do the detection.

Flower 和其他监视器不使用结果(任务状态),而是使用我们所说的事件

当 worker 中发生某些 Action 时,会发出事件消息,这会成为一个 transient 消息流。进程可以订阅某些事件(或所有事件)以监控集群。

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

  • 事件不是持久的( transient 的)

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

  • 复杂字段不序列化

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

关于Python Celery 任务在没有后端的情况下完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14277930/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com