2012-09-21 11 views
7

मैं आवधिक कार्यों को चलाने के लिए अपने आवेदन में celery का उपयोग करता हूं। चलो नीचेअजवाइन के लिए कॉलबैक 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 

सरल उदाहरण देखते हैं कि आप ऊपर के उदाहरण में देख सकते हैं, मैं celery का उपयोग async कार्य चलाने के लिए है, लेकिन (क्योंकि यह एक कतार है) मैं अन्यथा do_stuff या queue.ack(uid) में अपवाद के मामले में queue.fail(uid) करने की जरूरत है । इस स्थिति में दोनों मामलों में मेरे कार्य से कुछ कॉलबैक होने के लिए यह बहुत स्पष्ट और उपयोगी होगा - on_failure और on_success

मैंने कुछ documentation देखा, लेकिन apply_async के साथ कॉलबैक का उपयोग करने की प्रथाओं को कभी नहीं देखा। क्या यह करना मुमकिन है?

उत्तर

26

उपवर्ग टास्क वर्ग और on_success और 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 
5

आप लिंक और link_err kwargs के माध्यम से सफलता और त्रुटि कॉलबैक निर्दिष्ट कर सकते हैं जब आप apply_async कहते हैं। अजवाइन दस्तावेज़ों में एक स्पष्ट उदाहरण शामिल है: http://docs.celeryproject.org/en/latest/userguide/calling.html#linking-callbacks-errbacks