L'une des exigences du flux de travail sur lequel je travaille est d'attendre qu'un événement se produise pendant un temps donné.Si cela ne se produit pas, marquez la tâche comme ayant échoué, mais la tâche en aval doit être exécutée.
Je me demande si "all_done" signifie que toutes les tâches de dépendance sont effectuées, qu'elles aient réussi ou non.
https://airflow.incubator.Apache.org/concepts.html#trigger-rules
all_done signifie que toutes les opérations ont fini de fonctionner. Peut-être qu'ils ont réussi, peut-être pas.
all_success signifie que toutes les opérations se sont terminées sans erreur
Donc, votre supposition est correcte
[~ # ~] résumé [~ # ~]
Les tâches sont "toutes terminées" si le nombre de tâches SUCCESS, FAILED, UPSTREAM_FAILED, SKIPPED est supérieur ou égal au nombre de toutes les tâches en amont.
Vous ne savez pas pourquoi il serait supérieur à? Peut-être que les sous-balises font quelque chose de bizarre aux comptes.
Les tâches sont "toutes réussies" si le nombre de tâches en amont et le nombre de tâches en amont de succès sont les mêmes.
[~ # ~] détails [~ # ~]
Le code pour l'évaluation des règles de déclenchement est ici https://github.com/Apache/incubator-airflow/blob/master/airflow/ti_deps/deps/trigger_rule_dep.py#L72
Le code suivant exécute le qry
et renvoie la première ligne (la requête est une agrégation qui ne renverra jamais qu'une ligne de toute façon) dans les variables suivantes:
successes, skipped, failed, upstream_failed, done = qry.first()
la colonne "terminé" de la requête correspond à ceci: func.count(TI.task_id)
en d'autres termes un décompte de toutes les tâches correspondant au filtre. Le filtre spécifie qu'il ne compte que les tâches en amont, à partir du dag en cours, de la date d'exécution en cours et ceci:
TI.state.in_([
State.SUCCESS, State.FAILED,
State.UPSTREAM_FAILED, State.SKIPPED])
Donc done
est un décompte des tâches en amont avec l'un de ces 4 états.
Plus tard, il y a ce code
upstream = len(task.upstream_task_ids)
...
upstream_done = done >= upstream
Et la règle de déclenchement réelle échoue uniquement sur ce
if not upstream_done
Le code est assez simple et le concept est intuitif
num_failures = upstream - successes
if num_failures > 0:
... it fails
Pensez à utiliser ShortCircuitOperator aux fins que vous avez indiquées.