
在 Airflow 中,可通过组合定时调度、任务依赖与 TimeSensorAsync(或 TimeDeltaSensorAsync)实现:让 T08:30 任务仅在当日 T05:30 成功完成且到达指定时间后才触发。
在 airflow 中,可通过组合定时调度、任务依赖与 timesensorasync(或 timedeltasensorasync)实现:让 t08:30 任务仅在当日 t05:30 成功完成且到达指定时间后才触发。
Airflow 的 DAG 级调度(schedule_interval 或 schedule)控制整体触发节奏,而任务级依赖(>>)确保执行顺序与状态约束。要同时满足「每日固定时间运行」和「仅当上游任务当日成功才继续」两个条件,关键在于将时间等待逻辑下沉为一个显式任务,而非依赖 DAG 调度器本身。
推荐使用异步传感器(推荐 Airflow ≥ 2.6)实现轻量、非阻塞的“守时等待”:
from airflow import DAG
from airflow.operators.python import PythonOperator
from airflow.sensors.time import TimeSensorAsync # 异步版,避免 Worker 占用
from airflow.utils.dates import datetime
from airflow.utils.trigger_rule import TriggerRule
with DAG(
"daily_dependent_tasks",
schedule="0 5,8 * * *", # 每日 05:00 和 08:00 触发 DAG(注意:不是直接跑任务)
start_date=datetime(2024, 1, 1),
catchup=False,
max_active_runs=1,
) as dag:
def task_t0530():
print("Running T05:30 job — e.g., data ingestion")
return "success"
t0530 = PythonOperator(
task_id="T05:30",
python_callable=task_t0530,
execution_timeout=timedelta(minutes=10),
)
# 传感器:等待到当日 08:30(UTC 或 DAG timezone)
wait_until_0830 = TimeSensorAsync(
task_id="wait_until_0830",
target_time=time(8, 30),
mode="reschedule", # 关键:释放 worker,由 scheduler 重试
)
def task_t0830():
print("Running T08:30 job — e.g., report generation")
return "completed"
t0830 = PythonOperator(
task_id="T08:30",
python_callable=task_t0830,
trigger_rule=TriggerRule.ALL_SUCCESS, # 严格要求上游全部成功
)
# 依赖链:T05:30 → wait_until_0830 → T08:30
t0530 >> wait_until_0830 >> t0830✅ 为什么这样设计是“惯用解法”?
-
TimeSensorAsync不占用 Worker Slot,符合生产环境资源优化原则; - 依赖链天然保证:若
T05:30失败或跳过,wait_until_0830不会执行,T08:30因trigger_rule=ALL_SUCCESS被标记为skipped; -
schedule="0 5,8 * * *"确保 DAG 每日至少在 05:00 和 08:00 各被调度一次,但实际任务是否运行由依赖与传感器状态决定; - 所有逻辑内聚于 DAG 定义中,无需外部变量、XCom 轮询或自定义钩子,符合 Airflow 声明式哲学。
⚠️ 注意事项:
- 确保 DAG 的
timezone设置正确(如timezone="Asia/Shanghai"),否则target_time解析可能偏差; - 若需严格限定“仅当日成功”,请避免
catchup=True;catchup=False+start_date向前设置即可保障首次运行行为可预测; - 替代方案
TimeDeltaSensorAsync(等待 T05:30 完成后 3 小时)适用于相对时间场景,但本例中绝对时间(08:30)更精准可控。
综上,该模式平衡了调度语义清晰性、执行可靠性与系统资源效率,是 Airflow 社区广泛采用的定时+依赖组合范式。

















