2010-08-26 15 views
6

Me gustaría poder cancelar una tarea que se ejecuta desde una cola de Celery (usando rabbitMQ). Llamo a la tarea usandoAnular una tarea en ejecución en Apio dentro de django

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

donde AsyncBoot es una tarea definida.

Puedo obtener la identificación de la tarea (suponiendo que sea la cadena larga que devuelve apply_async) y almacenarla en una base de datos, pero no estoy seguro de cómo llamar a un método de cancelación. Veo cómo hacer que los métodos abortable con la clase de tareas Abortables pero si sólo tengo la cadena id-tarea, Como llamar en .abort() en la tarea? Gracias.

Respuesta

10

apply_async devuelve una instancia AsyncResult, o en este caso un AbortableAsyncResult. Guarde el task_id y úselo para instanciar un nuevo AbortableAsyncResult más adelante, asegurándose de proporcionar el argumento opcional de back-end si no está usando el default_backend.

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

después:

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

Vale la pena señalar que los documentos de apio dicen: "esta clase sólo funcionará con los backends de bases de datos." http://docs.celeryproject.org/en/latest/reference/celery.contrib.abortable.html?highlight=abort#celery.contrib.abortable – dgorissen

4

¿Has visto la documentación de referencia? http://celeryq.org/docs/reference/celery.contrib.abortable.html

para abortar el uso tarea result.abort():

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

Pero cómo consigo objeto de resultado en una fecha posterior si todo lo que tengo es la task_id? Estoy intentando abortar la tarea cuando ya no tengo acceso al objeto de resultado. Necesito de alguna manera sacarlo de la base de datos. – Anon

+0

Elija el objeto resultante en la base de datos luego – ionelmc

+0

'mytask.AsyncResult (task_id)' o 'from aplery.result import AsyncResult; AsyncResult (task_id) '. – asksol

Cuestiones relacionadas