Airflow触发规则:如何等待父任务完成并按序执行后续任务
问题描述
我的DAG中有一个主任务task_1,受系统限制,后续的task_2、task_3、task_4、task_5需按顺序执行。这些任务依赖task_1执行成功,但不依赖其他任务成功:task_1成功则启动task_2;若task_2失败,因task_1已成功且task_2已完成,task_3仍需启动。我为这些任务设置了one_success规则,但task_1完成后所有任务同时启动,无法按序执行。请问是否有办法等待所有父任务完成?
当前任务依赖配置如下:
task_1>> task_2>> task_3>> task_4>> task_5>>email task_1>> task_3 task_1>> task_4 task_1>> task_5
解决方案
核心问题是当前依赖配置让task_3/task_4/task_5直接依赖task_1,加上one_success规则会导致task_1成功后这些任务直接触发,破坏了顺序。要实现「按序执行、前序任务无论成败都触发下一个、且所有任务必须在task_1成功后才启动」的需求,可以通过调整依赖关系+使用all_done触发规则实现:
- 保留
task_1到task_2的直接依赖,确保task_2仅在task_1成功后启动 - 让每个后续任务同时依赖前一个任务和
task_1,并给每个后续任务设置trigger_rule=TriggerRule.ALL_DONE(表示所有父任务完成后触发,无论成功失败)
具体代码示例:
from airflow.utils.trigger_rule import TriggerRule # 基础依赖:task1成功后启动task2 task_1 >> task_2 # task3依赖task1和task2,两个都完成就触发(不管task2成败) task_2 >> task_3 task_1 >> task_3 task_3.trigger_rule = TriggerRule.ALL_DONE # task4依赖task1和task3,两个都完成就触发 task_3 >> task_4 task_1 >> task_4 task_4.trigger_rule = TriggerRule.ALL_DONE # task5依赖task1和task4,两个都完成就触发 task_4 >> task_5 task_1 >> task_5 task_5.trigger_rule = TriggerRule.ALL_DONE # 最后触发邮件任务 task_5 >> email
原理说明
task_2的上游只有task_1,默认触发规则是success,确保只有task_1成功才会启动task_2- 后续任务的上游是
task_1和前一个任务,all_done规则要求两个父任务都完成才触发:- 因为
task_2能启动的前提是task_1已经成功,所以当task_2完成时,task_1必然处于成功状态,间接保证了后续任务都满足「task_1成功」的依赖 - 前一个任务无论成败只要完成,就会触发下一个任务,符合需求
- 因为
- 同时因为每个后续任务依赖前一个任务完成,所以能严格保证
task_2→task_3→task_4→task_5的执行顺序,不会出现task_1成功后所有任务同时启动的问题
内容的提问来源于stack exchange,提问作者AlmostThere
相关产品推荐
相关产品推荐

