簡體   English   中英

如何進入完美的核心本地任務最終 state?

[英]How to get in prefect core local task final state?

我已經建立了一個流程,如果 kwarg 為空,它會隱式跳過運行給定任務。

我在任務 function 中使用類似的東西來跳過邏輯:

if kwargs.get('processors', Hierarchy()).__len__() == 0:
                    raise signals.SKIP('skipping task',
                                       result=Prediction())    

我想構建一些單元測試以確保跳過所述任務的最終 state。 在任務級別獲得 state 的最簡單方法是什么?

我可以從文檔中看到如何獲得流程而不是任務。

更新

為了補充克里斯的回應,我使用了他提出的第一個選項。 由於我的流程是在測試之外定義的,因此我創建了一個簡單的 function 來獲取一組已跳過的任務。 在測試中,這與應該跳過的任務列表進行了比較:

def get_skipped_tasks(flow_state):
        return set(key.name for key, value in flow_state.result.items() if value.is_skipped())

為了完整起見,我將在此處包含幾種方法; 對於我的示例,我將使用這個基本流程:

from prefect import task, Flow
from prefect.engine.signals import SKIP
import random


@task
def random_number():
    return random.randint(0, 100)

@task
def is_even(num):
    if num % 2:
        raise SKIP("odd number")
    return True

with Flow("dummy") as flow:
    even_task = is_even(random_number)

運行整個流程

交互式運行時,您始終可以運行整個流程並從父流程運行 state 訪問各個任務狀態; 請注意,當您“調用”任務(例如is_even(random_number) )時,會創建一個副本,因此您需要正確跟蹤這些副本。

flow_state = flow.run()

assert flow_state.result[even_task].is_skipped() # for example

使用模擬數據運行一段流程

交互式運行時,您還可以傳遞運行者將尊重的任務字典 -> state; 可以選擇為這些狀態提供數據:

from prefect.engine.state import Success

mocked_state = Success(result=2)


flow_state = flow.run(task_states={random_number: mocked_state})
assert not flow_state.result[even_task].is_skipped()

使用 TaskRunner

最后,如果你想單獨在這個任務上運行基於狀態的測試,你可以使用TaskRunner 這變得有點復雜,因為您必須使用Edge重新創建上游依賴項。

from prefect.engine.task_runner import TaskRunner
from prefect.edge import Edge

runner = TaskRunner(task=even_task)
edge = Edge(key="num", upstream_task=random_number, downstream_task=even_task)


task_state = runner.run(upstream_states={edge: mocked_state})
assert not task_state.is_skipped()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM