2011-06-30 4 views
5

J'ai une tâche parente qui générera un nombre arbitraire et potentiellement important de sous-tâches. Une fois le parent et toutes les sous-tâches terminées, je dois définir un drapeau dans ma base de données pour indiquer qu'il est prêt. Comment ferais-je le mieux pour le faire?Détection d'une tâche de céleri et de toutes les sous-tâches

Par exemple:

@task() 
def master_task(foo): 
    foo_obj = Foo.objects.get(id=foo) 
    for bar in foo_obj.bar_set.all(): 
     more_work.delay(bar.id) 

@task() 
def more_work(bar): 
    bar_obj = Bar.objects.get(id=bar) 
    do_work() 

je dois détecter quand le master_task et tous les sous-tâches qu'elle a fraye ont terminé pour que je puisse mettre un drapeau sur un modèle lié pour indiquer que tout est prêt

Répondre

4

utilisez chords

Vous devez utiliser un [taskset] [1]: > Le taskset permet l'invocation facile de plusieurs tâches à la fois, et est alors en mesure de rejoindre les résultats en le même ordre que les tâches ont été invoquées.
+0

Notez que "TaskSet a été supprimé, car il a été remplacé par la construction de groupe dans Celery 3.0." – np8

Questions connexes