web-dev-qa-db-fra.com

Annuler une tâche déjà en cours d'exécution avec Celery?

Je lisais le document et cherchais mais je n'arrive pas à trouver une réponse directe:

Pouvez-vous annuler une tâche déjà en cours d'exécution? (comme dans la tâche a commencé, prend un certain temps, et à mi-chemin il doit être annulé)

J'ai trouvé cela dans le doc à Céleri FAQ

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

Mais je ne sais pas si cela va annuler les tâches en file d'attente ou si cela va tuer un processus en cours d'exécution sur un travailleur. Merci pour toute lumière que vous pouvez jeter!

77
dcoffey3296

revoke annule l'exécution de la tâche. Si une tâche est révoquée, les travailleurs l'ignorent et ne l'exécutent pas. Si vous n'utilisez pas les révocations persistantes, 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 de fin qui est False par défaut. Si vous devez supprimer la tâche en cours d'exécution, vous devez définir la commande terminate sur True.

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

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

142
mher

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

Selon le Céleri FAQ , 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)
29
Rockallite

La réponse de @ 0x00mh est correcte, cependant le céleri récent docs indique que l'utilisation de l'option terminate est "un dernier recours pour les administrateurs" car vous pourriez accidentellement mettre fin à une autre tâche dont l'exécution avait commencé entre temps. Peut-être une meilleure solution consiste-t-elle à associer terminate=True à signal='SIGUSR1' (ce qui provoque le déclenchement de l'exception SoftTimeLimitExceeded dans la tâche).

16
kouk

Voir les options suivantes pour les tâches: time_limit , soft_time_limit (ou vous pouvez le définir pour les travailleurs). Si vous souhaitez contrôler non seulement le temps d'exécution, reportez-vous à l'argument expires de la méthode apply_async.

0
simplylizz

En outre, non satisfaisant, il existe un autre moyen (tâche d’abandon) pour arrêter la tâche, mais il existe de nombreux problèmes de fiabilité, voir: http://docs.celeryproject.org/en/latest/reference/ celery.contrib.abortable.html

0
xiaopo