2010-08-26 4 views
6

Je voudrais être en mesure d'interrompre une tâche qui s'exécute à partir d'une file d'attente Celery (en utilisant rabbitMQ). J'appelle la tâche en utilisantAnnulation d'une tâche en cours dans Celery dans django

task_id = AsyncBoot.apply_async(args=[name], name=name, connect_timeout=3) 

où AsyncBoot est une tâche définie.

Je peux obtenir l'ID de la tâche (en supposant que c'est la chaîne longue que renvoie apply_async) et le stocker dans une base de données, mais je ne sais pas comment appeler une méthode d'abandon. Je vois comment faire des méthodes avortables avec la classe des tâches Abortable mais si je n'ai que la chaîne task-id, comment puis-je appeler .abort() sur la tâche? Merci.

Répondre

10

apply_async retourne une instance AsyncResult, ou dans ce cas un AbortableAsyncResult. Enregistrez le task_id et utilisez-le pour instancier un nouveau AbortableAsyncResult ultérieurement, en vous assurant de fournir l'argument facultatif backend si vous n'utilisez pas le default_backend.

abortable_async_result = AsyncBoot.apply_async(args=[name], name=name, connect_timeout=3) 
myTaskId = abortable_async_result.task_id 

plus tard:

abortable_async_result = AbortableAsyncResult(myTaskId) 
abortable_async_result.abort() 
+1

Il est à noter que les docs de céleri disent: "cette classe ne fonctionnera qu'avec les backends de base de données." http://docs.celeryproject.org/en/latest/reference/celery.contrib.abortable.html?highlight=abort#celery.contrib.abortable – dgorissen

4

Avez-vous vu la documentation de référence? http://celeryq.org/docs/reference/celery.contrib.abortable.html

Pour interrompre l'utilisation de la tâche result.abort():

>>> result = AsyncBoot.apply_async(...) 
>>> result.abort() 
+0

Mais comment puis-je obtenir l'objet de résultat à une date ultérieure si j'ai est le task_id? J'essaie d'annuler la tâche lorsque je n'ai plus accès à l'objet résultat. J'ai besoin de le retirer de la base de données. – Anon

+0

Pickle l'objet résultat dans la base de données puis – ionelmc

+0

'mytask.AsyncResult (task_id)' ou 'de celery.result import AsyncResult; AsyncResult (task_id) '. – asksol

Questions connexes