Python 如何在失败时恢复完美的流而不必重新运行整个流? TL;博士

Python 如何在失败时恢复完美的流而不必重新运行整个流? TL;博士,python,prefect,Python,Prefect,我不能用级长的来解决上面的问题。我可能是用错了(见下文)或者遗漏了什么。如果有任何建议,我将不胜感激 问题 我通读了这篇精彩的文章,发现其中最相关的部分(可能遗漏了什么!)。(在我看来)这门课就是解决办法 要查看是否可以使用Flow Runner恢复失败的流,请执行以下操作: 运行失败的流: 从时间导入睡眠 进口总监 从完美导入流程、任务 @任务 def success(): 睡眠(3) 返回 @任务 def failure(): 返回1/0 def get_flow_runner():

我不能用级长的来解决上面的问题。我可能是用错了(见下文)或者遗漏了什么。如果有任何建议,我将不胜感激


问题 我通读了这篇精彩的文章,发现其中最相关的部分(可能遗漏了什么!)。(在我看来)这门课就是解决办法

要查看是否可以使用Flow Runner恢复失败的流,请执行以下操作:

  • 运行失败的流:
从时间导入睡眠
进口总监
从完美导入流程、任务
@任务
def success():
睡眠(3)
返回
@任务
def failure():
返回1/0
def get_flow_runner():
以流程(“成功/失败”)为流程:
成功()
失败()
返回完美引擎FlowRunner(流量)
  • 在iPython中运行并保存状态:
[1]中的
:运行nameofscript.py
在[2]中:flow\u runner=get\u flow\u runner()
在[3]中:state=flow\u runner.run()
  • failure()
    中将1/0替换为1/1,因此任务将成功:

  • 最后将前一个状态传递给
    flow\u runner
    ,希望它能够恢复流:

[1]中的
:运行nameofscript.py
在[2]中:flow\u runner=get\u flow\u runner()
在[3]中:flow\u runner.run(task\u states=state.result)

整个流程再次运行,包括3秒钟的成功任务。

这里的问题是,每次运行都要重建流程,这会更改任务对象
state.result
是一个字典,其键是任务对象——如果底层任务对象以任何方式发生更改,其哈希也会发生更改。相反,您应该使用更新的任务对象手动创建状态字典,如下所示:

从perfict.engine.state导入成功
failure\u task=runner.flow.get\u tasks(name=“failure”)[0]
task_states={failure_task:Success(“模拟成功”)}

谢谢@chriswhite这解决了上面的例子!我在一个新的场景中尝试了这一点,任务传递数据,我的模拟成功被覆盖。在Perfict文档中有一个关于检查点和结果处理程序的部分,这可以用于在中断的任务中恢复流程吗?您可以分享代码吗?如果我不得不猜测,在另一个示例中,您有多个名为“失败”的任务。仅供参考,模拟数据通道您可以使用
Success(“模拟数据”,result=42)
或任何数据。