2012-09-21 3 views
7

Io uso celery nella mia applicazione per eseguire attività periodiche. Vediamo semplice esempio di seguitoChiamata per sedano 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 

Come si può vedere nell'esempio qui sopra, io uso celery per eseguire operazione asincrona, ma (dato che è una coda) ho bisogno di fare queue.fail(uid) in caso di eccezioni in do_stuff o queue.ack(uid) altrimenti . In questa situazione sarebbe molto chiaro e utile avere qualche richiamata dal mio compito in entrambi i casi: on_failure e on_success.

Ho visto alcuni documentation, ma mai visto pratiche di utilizzo di callback con apply_async. è possibile farlo?

risposta

26

sottoclasse classe Task e sovraccaricare le funzioni on_success e 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