2012-09-21 14 views
7

Uso celery en mi aplicación para ejecutar tareas periódicas. Veamos ejemplo sencillo continuaciónDevolución de llamada para apio apply_async

from myqueue import Queue 
@perodic_task(run_every=timedelta(minutes=1)) 
def process_queue(): 
    queue = Queue() 
    uid, questions = queue.pop() 
    if uid is None: 
     return 

    job = group(do_stuff(q) for q in questions) 
    job.apply_async() 

def do_stuff(question): 
    try: 
     ... 
    except: 
     ... 
     raise 

Como se puede ver en el ejemplo anterior, yo uso celery para ejecutar la tarea asíncrona, pero (ya que es una cola) que tengo que hacer queue.fail(uid) en caso de excepción en do_stuff o queue.ack(uid) lo contrario . En esta situación, sería muy claro y útil tener alguna devolución de llamada de mi tarea en ambos casos: on_failure y on_success.

vi algunas documentation, pero nunca había visto las prácticas de uso de las devoluciones de llamada con apply_async. ¿Es posible hacer eso?

Respuesta

26

subclase de la clase de tareas y la sobrecarga de las funciones on_success y on_failure:

class CallbackTask(Task): 
    def on_success(self, retval, task_id, args, kwargs): 
     pass 

    def on_failure(self, exc, task_id, args, kwargs, einfo): 
     pass 


@celery.task(base=CallbackTask) # this does the trick 
def add(x, y): 
    return x + y 
Cuestiones relacionadas