Airflow 如何从DAG中删除任务

Airflow 如何从DAG中删除任务,airflow,Airflow,我有两个定义的任务应该重用(定义一次),并且取决于一些变量模式以不同的方式连接,一些任务可能在所需的dag中被完全排除,但目前找不到一个简单的方法如何以编程方式从dag任务集合中排除所有这些任务 (例如,在模式C中,任务t3和t5不应成为dag的一部分。) 我知道BranchPythonOperator和触发规则s,但DAG变得超级复杂,因为依赖于每个任务实例的过去语义 mode='A'或'B'或'C' 使用DAG(DAG_id=模式, 开始日期=。。。, 计划时间间隔=。。。, 默认值_arg

我有两个定义的任务应该重用(定义一次),并且取决于一些变量
模式
以不同的方式连接,一些任务可能在所需的dag中被完全排除,但目前找不到一个简单的方法如何以编程方式从
dag
任务集合中排除所有这些任务

(例如,在模式
C
中,任务
t3
t5
不应成为dag的一部分。)

我知道
BranchPythonOperator
触发规则
s,但DAG变得超级复杂,因为
依赖于每个任务实例的过去
语义

mode='A'或'B'或'C'
使用DAG(DAG_id=模式,
开始日期=。。。,
计划时间间隔=。。。,
默认值_args=…)为dag:
start=DummyOperator(任务\u id='start')
t1=DummyOperator(任务id='t1')
t2=DummyOperator(任务id='t2')
t3=DummyOperator(任务id='t3')
t4=DummyOperator(任务id='t4')
t5=DummyOperator(任务id='t5')
end=dummy运算符(任务id='end')
如果模式='A':
开始>>t1>>t2>>t3>>t4>>t5>>结束
elif mode='B':
开始>>[t1,t2]>>t3>>t4>>t5>>结束
elif mode='C':
开始>>t1>>t4>>t2>>结束
对于枚举中的i,t(dag.tasks):
如果t.task\u id不在end.upstream\u task\u id中:
#dag.tasks[i].dag=None#错误,没有dag设置程序
dag.tasks.remove(t)#没有帮助
如果有
dag.remove_task(…)
也能用同样的方法工作,那就太好了

我使用任务工厂方法找到了一个“丑陋”的解决方案,该方法将
dag
作为参数

mode='A'或'B'或'C'
def start(dag:dag):返回dummy运算符(dag=dag,task_id='start')
deft1(dag:dag):返回dummy运算符(dag=dag,task_id='t1')
deft2(dag:dag):返回DummyOperator(dag=dag,task_id='t2')
DEFT3(dag:dag):返回DummyOperator(dag=dag,task_id='t3')
def t4(dag:dag):返回dummy运算符(dag=dag,task_id='t4')
deft5(dag:dag):返回dummy操作符(dag=dag,task_id='t5')
def end(dag:dag):返回dummy运算符(dag=dag,task_id='end')
使用DAG(DAG_id=模式,
开始日期=。。。,
计划时间间隔=。。。,
默认值_args=…)为dag:
如果模式='A':
开始(dag)>>t1(dag)>>t2(dag)>>t3(dag)>>t4(dag)>>t5(dag)>>结束(dag)
elif mode='B':
开始(dag)>>[t1(dag),t2(dag)]>>t3(dag)>>t4(dag)>>t5(dag)>>结束(dag)
elif mode='C':
开始(dag)>>t1(dag)>>t4(dag)>>t2(dag)>>结束(dag)
我发现了一个“丑陋”的解决方案,它使用了任务工厂方法,该方法将
dag
作为参数

mode='A'或'B'或'C'
def start(dag:dag):返回dummy运算符(dag=dag,task_id='start')
deft1(dag:dag):返回dummy运算符(dag=dag,task_id='t1')
deft2(dag:dag):返回DummyOperator(dag=dag,task_id='t2')
DEFT3(dag:dag):返回DummyOperator(dag=dag,task_id='t3')
def t4(dag:dag):返回dummy运算符(dag=dag,task_id='t4')
deft5(dag:dag):返回dummy操作符(dag=dag,task_id='t5')
def end(dag:dag):返回dummy运算符(dag=dag,task_id='end')
使用DAG(DAG_id=模式,
开始日期=。。。,
计划时间间隔=。。。,
默认值_args=…)为dag:
如果模式='A':
开始(dag)>>t1(dag)>>t2(dag)>>t3(dag)>>t4(dag)>>t5(dag)>>结束(dag)
elif mode='B':
开始(dag)>>[t1(dag),t2(dag)]>>t3(dag)>>t4(dag)>>t5(dag)>>结束(dag)
elif mode='C':
开始(dag)>>t1(dag)>>t4(dag)>>t2(dag)>>结束(dag)

你有没有考虑过<代码> BrangPython操作符< /代码>?我在我的问题中提到过。对不起,我是瞎子。(你考虑过<代码> BrnChyPython运算符< /代码>吗?我在我的问题中提到过。对不起,我是瞎子。”