如何在发生故障时恢复Prefect流程而不必重新运行整个流程?

时间:2020-07-27 09:49:14

标签: python prefect

TL; DR;

我无法使用县长的FlowRunner来解决上述问题。我可能用错了(见下文)或错过了一些东西。真的很感谢任何指针!


问题

我通读了精彩的prefect core documentation,发现Handling FailureLocal Debugging上的部分与此最相关(可能错过了一些内容!)。 FlowRunner类对我来说似乎是解决方案。

查看我是否可以使用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中运行它并保存状态:
In [1]: run nameofscript.py
In [2]: flow_runner = get_flow_runner()
In [3]: state = flow_runner.run()
  • failure()中用1/1替换1/0,这样任务将成功完成:

  • 最后将先前的状态传递给flow_runner,希望它能恢复流程:

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

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

1 个答案:

答案 0 :(得分:4)

这里的问题是,您每次运行都会重新构建Flow,这会更改Task对象。 state.result是一个字典,其关键字是Task对象-如果基础Task对象以任何方式更改,则其哈希也将更改。您应该改为使用更新的Task对象手动创建状态字典,如下所示:

from prefect.engine.state import Success

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