10
votes

Suivi des progrès d'une tâche de céleri.group?

@celery.task
def my_task(my_object):
    do_something_to_my_object(my_object)


#in the code somewhere 
tasks = celery.group([my_task.s(obj) for obj in MyModel.objects.all()])
group_task = tasks.apply_async()
Question: Does celery have something to detect the progress of a group task? Can I get the count of how many tasks were there and how many have been processed?

0 commentaires

3 Réponses :


6
votes

Tinkering autour de la coquille (oil d'ipython Auto-achèvement automatique) J'ai trouvé que group_task (qui est un célery.result.reesultset (code> objet ) avait une méthode appelée Terminé_count qui a donné exactement ce dont j'avais besoin.

a également trouvé la documentation chez HTTP : //docs.celeryproject.org/en/latest/reeferfing/celery.result.html#celery.result.Resultset.com


2 commentaires

Bonjour, j'ai probablement été longue depuis que vous avez rencontré cela, mais je me demande comment vous utilisez cela pour suivre la progression des tâches du groupe sans bloquer .. Si je comprends bien, j'ai besoin d'attribuer résultat = task_group.apply_async () , mais la simple affectation elle-même bloque. Sur les autres mains, si nous n'abandonnons pas, nous n'avons pas les méthodes de restauration complétées_count etc ...


@zeroHedge résultat = task_group.apply_async () ne doit pas bloquer les résultats, il bloquera jusqu'à ce que toutes les tâches soient en cours, ce qui prenait un moment si vous avez beaucoup de tâches



1
votes

lecture de la documentation pour asyncresult Il existe une méthode collect qui collecte des résultats car ils entrent.

http://docs.celeryproject.org/en/latest/reference/cele.result. html # célery.result.asyncresult.collect xxx

Exemple de sortie: xxx

Remarque: L'option Task.trail doit être activée de sorte que la liste des enfants soit stockée dans résultat.children . Ceci est la valeur par défaut mais activé explicitement pour l'illustration.

EDIT:

Au cours des tests supplémentaires, cela a constaté que tout en collectant des États, il attendra des résultats, il attend toujours. J'ai constaté que pour obtenir les progrès que vous devez obtenir le résultat des enfants, comme: xxx

TQDM affiche une progression dans la console

la mygrraptask est un groupe de céleri retour, comme: xxx


2 commentaires

Cela attendra que toutes les tâches de l'enfant remplissent puis renvoient leurs résultats, il ne montre pas de progrès tandis que le groupe est toujours en cours d'exécution.


Mis à jour pour produire réellement une progression, travaillant dans la production



4
votes

Voici un exemple de travail complet basé sur la réponse de @ Dalore.

Premier Tâches.py code>. p>

docker stop my-rabbit my-redis
docker rm my-rabbit my-redis


2 commentaires

Je pense que vous devez mettre "Trail = true" dans @ app.task et pas dans la définition des fonctions


@LBCOMMER merci. Fixé. Son par défaut n'est pas nécessaire, mais comme dans la réponse de Dalore, j'aime bien être explicite depuis que ce comportement en dépend.