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!
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
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)
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).
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.
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