簡體   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