簡體   English   中英

Prefect:如何根據從參數派生的任務列表強制創建任務

[英]Prefect: How to imperatively create tasks based on a task list derived from a Parameter

我正在嘗試根據列表強制定義任務。 挑戰在於該列表應基於 Prefect 參數。

下面是我試過的代碼,但顯然它不起作用,因為 task_dependency_pairs 是一個任務,而不是一個列表。

如何在不破壞 Parameter 任務和其他動態生成的任務之間的依賴關系的情況下使其工作?

from prefect import task, Flow, Parameter, Task
import time

@task
def task_dependency_pairs(param):
    return [
    ('task 1', f'{param}A', ''),
    ('task 2', f'{param}B','task 1'),
    ('task 3', f'{param}C','task 1')]

class Task_class(Task):

    def run(self, **kwarg):   
        time.sleep(5)
        print(f"This task {kwarg['task_name']} does a lot of things with {kwarg.get('calc_value','')}.")

for task_name, dependency in task_dependency_pairs:
    globals()[task_name] = type(task_name, (Task_class,),{"__module__": __name__})

with Flow("my_process") as flow:

    param = Parameter("param", default="default_param")
    task_dependency_pairs_list = task_dependency_pairs(param)
    for task_name, calc_value, dependency in task_dependency_pairs_list:   # This won't work
        task_instance = globals()[task_name](name=task_name)
        flow.add_task(task_instance(task_name = task_name, calc_value = calc_value))

    for task_name, calc_value, dependency in task_dependency_pairs_list:  # This won't work
        if len(dependency) >0:
            flow.get_tasks(name=task_name)[0].set_upstream(flow.get_tasks(name=dependency)[0])

flow.visualize()

嘗試在完美流程中動態創建任務最好通過映射功能進行管理

但是,映射只會在流程運行期間從可迭代對象生成任務。 它不會隨意調整生成任務的依賴關系; 它們都共享在主mapped任務上定義的依賴項。

但是,如果您想在運行時生成一個流(具有編程依賴項),我能想到的唯一方法是創建一個任務來創建一個流並立即運行它。

這可能會尋找您的流程的方式是:

...

@task
def run_flow(inputs):
    with Flow("subflow") as sub_flow:
        for (name, calc_value, dependency) in inputs:
            inst = Task_class(name=name)(task_name=name, calc_value=calc_value)
            sub_flow.add_task(inst)
            if dependency:
                inst.set_upstream(sub_flow.get_tasks(name=dependency)[0])

    sub_flow.run()

with Flow("my_process") as flow:
    param = Parameter("param", default="default_param")
    task_dependency_pairs_list = task_dependency_pairs(param)
    run_flow(task_dependency_pairs_list)

暫無
暫無

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

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