108 votes

Annuler une tâche déjà exécutée avec Celery ?

J'ai lu le document et fait des recherches, mais je n'ai pas trouvé de réponse claire :

Peut-on annuler une tâche déjà en cours d'exécution ? (par exemple, la tâche a commencé, prend un certain temps et à mi-chemin, il faut l'annuler).

J'ai trouvé ceci dans le document à FAQ sur le céleri

>>> result = add.apply_async(args=[2, 2], countdown=120)
>>> result.revoke()

Mais je ne sais pas si cela annulera les tâches en attente ou si cela tuera un processus en cours sur un travailleur. Merci pour tout éclairage que vous pourrez apporter !

206voto

0x00mh Points 2696

révoquer annule l'exécution de la tâche. Si une tâche est révoquée, les workers ignorent la tâche et ne l'exécutent pas. Si vous n'utilisez pas de révocation persistante, votre tâche peut être exécutée après le redémarrage du travailleur.

http://docs.celeryproject.org/en/latest/userguide/workers.html#worker-persistent-revokes

revoke a une option terminate qui est Faux par défaut. Si vous avez besoin de tuer la tâche en cours d'exécution, vous devez définir la valeur terminate à Véritable .

>>> from celery.task.control import revoke
>>> revoke(task_id, terminate=True)

http://docs.celeryproject.org/en/latest/userguide/workers.html#revoke-revoking-tasks

48voto

Rockallite Points 178

Dans Celery 3.1, l'option API de révocation des tâches est modifié.

Selon le FAQ sur le céleri vous devez utiliser result.revoke :

>>> result = add.apply_async(args=[2, 2], countdown=120)
>>> result.revoke()

ou si vous n'avez que l'identifiant de la tâche :

>>> from proj.celery import app
>>> app.control.revoke(task_id)

31voto

kouk Points 1233

La réponse de @0x00mh est correcte, cependant le céleri récent docs disent que l'utilisation du terminate est " un dernier recours pour les administrateurs "car vous pourriez accidentellement mettre fin à une autre tâche qui a commencé à s'exécuter entre-temps. Une meilleure solution consiste peut-être à combiner terminate=True avec signal='SIGUSR1' (ce qui entraîne la levée de l'exception SoftTimeLimitExceeded dans la tâche).

2voto

simplylizz Points 760

Voir les options suivantes pour les tâches : limite de temps , soft_time_limit (ou vous pouvez le définir pour les travailleurs). Si vous voulez contrôler non seulement le temps d'exécution, alors voir expirant à argument de la méthode apply_async.

2voto

xiaopo Points 31

En outre, insatisfaisant, il y a un autre moyen (abort task) pour arrêter la tâche, mais il y a beaucoup de manque de fiabilité, plus de détails, voir : http://docs.celeryproject.org/en/latest/reference/celery.contrib.abortable.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X