2010-12-02 19 views
11

¿Cómo puedo comprobar si una tarea (task_id) todavía se procesa en celery? Tengo el siguiente escenario:Prueba si todavía se está procesando una tarea de apio

  1. iniciar una tarea en una vista de Django
  2. tienda del BaseAsyncResult en la sesión
  3. apagado el demonio de apio (dura) por lo que la tarea no se procesa más
  4. Comprobar si la tarea es 'muerta'

¿Alguna idea? ¿Se puede buscar toda la tarea procesada por apio y verificar si la mía todavía está allí?

+1

Hey, yo también estoy buscando algo similar a esto, se hizo alguna vez llegar a resolver esto? Me pregunto si debo almacenar el task_id en el marco de caché de django. Sé que puedo usar algo como esto http://dpaste.com/370419/ para obtener el estado de la tarea. Pero estoy confundido entre el uso de la base de datos, la memoria caché para almacenar task_id. – Chantz

Respuesta

3

definir un campo (PickledObjectField) en su modelo para almacenar la tarea de apio:

class YourModel(models.Model): 
    . 
    . 
    celery_task = PickledObjectField() 
    . 
    . 

    def task(): 
     self.celery_task = SubmitTask.apply_async(args = self.task_detail()) 
     self.save() 

En caso de que su tarea no es específica en cualquier modelo debe crear uno específicamente para las tareas de apio.

o si no sugiero usar django-apio. Tiene una buena característica de monitoreo:
http://ask.github.com/celery/userguide/monitoring.html#django-admin-monitor, guarda los detalles de las tareas en un modelo django de una manera gráfica agradable.

+0

Sí, uso django-apio y hago búsquedas en el modelo interno TaskMeta para obtener el estado. Gracias por la respuesta. –

0

Creo que hay una manera mejor que almacenar un objeto de tarea en el modelo. Por ejemplo, en caso de que quería comprobar si un grupo de tareas (en paralelo) han completado:

# in the script you launch the task 
from celery import group 

job = group(
    task1.s(param1, param2), 
    task2.s(param3, param4) 
) 
result = job.apply_async() 
result.save() 

# save the result ID in your model 
your_obj_model = YourModel.objects.get(id='1234') 
your_obj_model.task_id = result.id 
your_obj_model.save() 

A continuación, en su opinión

from celery.result import GroupResult 
# ... 
task_result = GroupResult.restore(your_obj_model.task_id) 
task_finished = task_result.ready() 
# will be True or False 
Cuestiones relacionadas