2015-10-13 10 views
10

मैं दो अजवाइन कार्य है कहो । मैं क्या चाहता हूं कि अनुक्रम क्रम में क्रम में सभी वस्तुओं के लिए कार्य को चलाने के लिए है, लेकिन अपवाद पर चलना जारी रखें, इन सभी को पूरा होने के बाद एक नया अपवाद उठाएं।कैसे अजवाइन के Task.map में त्रुटियों को संभालने के लिए

आदर्श होगा यदि मैं इसे लागू करने से पहले xmap ऑब्जेक्ट पर ऑनफेलर जोड़ सकता हूं, लेकिन xmap पूर्ण कार्य ऑब्जेक्ट नहीं दिखता है।

उत्तर

0

आप त्रुटियों को इंगित करने और प्रसारित करने के लिए अपना वापसी मूल्य बदल सकते हैं। इसलिए जैसा:

import traceback 

@celery.task 
def run_flakey_things(*args, **kwargs): 
    return run_flakey_and_synchronous_thing.map(
     xrange(10) 
    ).apply_async() 


@celery.task 
def run_flakey_and_synchronous_thing(a): 
    d = {'value': None, 'error': None} 
    try: 
     if a % 5: 
      d['value'] = a 
    except: 
     d['error'] = traceback.format_exc() 
    return d 

फिर आप कुछ कर सकते हैं:

1) के साथ और त्रुटियों के बिना समूह बातें करने के लिए अपने run_flakey_things बदलें, त्रुटियों के बिना लोगों को वापस जाने और त्रुटियों के साथ लोगों को रिपोर्ट करते हैं।

2) जो भी व्यवहार कर रहा है उस व्यवहार को संभालें run_flakey_things

0

मैंने अजवाइन का उपयोग नहीं किया है। हालांकि क्या आप subtask में __call__ विधि जोड़ सकते हैं? की तरह कुछ:

class MyTask: 
    def __call__(self, *args, **kwargs): 
     try: 
      super(self, MyTask).__call__(*args, **kwargs) 
     except Exception, exc: 
      # store exc to be raised later in the main task 

@celery.task(base=MyTask): 
def run_flakey_and_synchronous_thing(a): 
    # ... 
तब मुख्य run_flakey_things कार्य के लिए

, शायद How to override __call__ in celery on main? के रूप में, संग्रहीत अपवाद को पुनः प्राप्त करने apply_async() ओवरराइड।

संबंधित मुद्दे