我正在处理的工作流程中的一个要求是等待某个事件在给定时间内发生,如果没有发生则将任务标记为失败仍然应该执行下游任务.
我想知道"all_done"是否意味着所有依赖任务都已完成,无论它们是否成功.
https://airflow.incubator.apache.org/concepts.html#trigger-rules
all_done表示所有操作都已完成.也许他们成功了,也许不是.
all_success表示所有操作都已完成且没有错误
所以你的猜测是正确的
小结
如果SUCCESS,FAILED,UPSTREAM_FAILED,SKIPPED任务的计数大于或等于所有上游任务的计数,则任务"全部完成".
不知道为什么会比这更大?子公司也许做了一些奇怪的事情.
如果上游任务的计数和上游任务的成功计数相同,则任务"全部成功".
详细信息
评估触发器规则的代码在https://github.com/apache/incubator-airflow/blob/master/airflow/ti_deps/deps/trigger_rule_dep.py#L72
全部完成
以下代码运行qry
并返回第一行(查询是一个只会返回一行的聚合)到以下变量中:
successes, skipped, failed, upstream_failed, done = qry.first()
查询中的"完成"列对应于此:func.count(TI.task_id)
换句话说,匹配过滤器的所有任务的计数.过滤器指定它仅计算当前dag中的上游任务,从当前执行日期开始计算:
TI.state.in_([ State.SUCCESS, State.FAILED, State.UPSTREAM_FAILED, State.SKIPPED])
因此done
是对这4个状态之一的上游任务的计数.
后来有这个代码
upstream = len(task.upstream_task_ids) ... upstream_done = done >= upstream
实际的触发规则只会失败
if not upstream_done
ALL_SUCCESS
代码相当简单,概念很直观
num_failures = upstream - successes if num_failures > 0: ... it fails
考虑将ShortCircuitOperator 用于您所述的目的.