2012-09-21 2 views
7

주기적인 작업을 실행하려면 내 응용 프로그램에 celery을 사용합니다. 내가 비동기 작업을 실행 celery를 사용하지만 (이 큐를 이후) 내가 다른 do_stuff 또는 queue.ack(uid)에 예외의 경우 queue.fail(uid)을 할 필요가, 당신은 위의 예에서 볼 수 있듯이 이제셀레 리에 대한 콜백 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 

아래 간단한 예를 들어 보자 . 이 상황에서 두 작업 모두에서 내 작업의 콜백 (on_failureon_success)을 갖는 것이 매우 분명하고 유용 할 것입니다.

documentation을 보았지만 apply_async과 함께 콜백을 사용하는 사례는 본 적이 없습니다. 그렇게 할 수 있습니까? 작업 클래스와는 on_success 및 ON_FAILURE 기능을 오버로드

답변

26

서브 클래스 : 당신이 apply_async 호출 할 때

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 
관련 문제