繁体   English   中英

如何在失败时恢复 Prefect 流程而无需重新运行整个流程?

[英]How to resume a Prefect flow on failure without having to re-run the entire flow?

TL;博士;

我无法使用 prefect 的FlowRunner来解决上述问题。 我可能要么用错了(见下文),要么错过了一些东西。 真的很感激任何指点!


问题

我通读了出色的核心文档,发现 处理失败本地调试的部分与此最相关(可能遗漏了一些东西。)。 FlowRunner class 似乎(对我来说)是解决方案。

看看我是否可以使用 Flow Runner 来恢复失败的流程:

  • 进行了失败的流程运行:
from time import sleep

import prefect
from prefect import Flow, task


@task
def success():
    sleep(3)
    return


@task
def failure():
    return 1 / 0


def get_flow_runner():
    with Flow("Success/Failure") as flow:

        success()
        failure()

    return prefect.engine.FlowRunner(flow)
  • 在 iPython 中运行它并保存 state:
In [1]: run nameofscript.py
In [2]: flow_runner = get_flow_runner()
In [3]: state = flow_runner.run()
  • failure()中将 1 / 0 替换为 1 / 1 以便任务成功:

  • 最后将之前的 state 传递给flow_runner ,希望它能够恢复流程:

In [1]: run nameofscript.py
In [2]: flow_runner = get_flow_runner()
In [3]: flow_runner.run(task_states=state.result)

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

这里的问题是您在每次运行时都在重建 Flow,这会更改 Task 对象。 state.result是一个字典,其键是任务对象 - 如果基础任务 object 发生任何变化,那么它的 hash 也会发生变化。 您应该改为使用更新的 Task 对象手动创建状态字典,如下所示:

from prefect.engine.state import Success

failure_task = runner.flow.get_tasks(name="failure")[0]
task_states = {failure_task: Success("Mocked success")}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM