2014-10-06 8 views
5

है, तो मुझे सेलेरी और पायथन के साथ प्रारंभ करना शुरू हो रहा है, और मेरे पास एक प्रश्न है जो शायद बहुत आसान है, लेकिन मुझे लगता है कि कोई उपयुक्त उत्तर नहीं मिल रहा है ..पायथन सेलरी: यदि कोई अपवाद

यदि मेरे पास कार्य का एक गुच्छा है, और उनमें से एक फेंकता है, तो एक अपवाद है, क्या कार्य को पारित किए गए तर्कों को पुनः प्राप्त करने का कोई तरीका है?

उदाहरण के लिए, अगर मैं आईपी कुछ होस्ट नामों को हल प्राप्त करना चाहते हैं, और मैं भी कार्य बना ...

@tasks_app.task 
def resolve_hostname(hostname): 
    return (hostname, {hst.address for hst in dns.resolver.query(hostname)}) 

... जो एक अपवाद फेंक सकता है, वहाँ हो रही का एक तरीका है उस अपवाद के दौरान उस hostname कॉल के बाहर तर्क का मूल्य?

ip_subtasks = group(
    resolve_hostname.s(hostname) for hostname in ['google.com', 
                'yahoo.com', 
                'failure.kommm'] 
)() 

पिछले एक (कि failure.kommm को हल करने की कोशिश करता है) एक अपवाद बढ़ा देंगे:

की मैं समूह का कहना है कि जैसे कार्यों करते हैं। मैं एक try/catch अंदर अजवाइन कार्य की get() विधि शामिल करना चाहते हैं, और (नीचे दिखाया गया जैसे कुछ) एक संदेश कह कुछ जब failure.kommm को हल करने की कोशिश कर गलत हो गया था दिखाने:

for ip_subtask in ip_subtasks: 
    try: 
     hostname, ips = ip_subtask.get(timeout=45) 
    except dns.exception.DNSException, e: 
     # I WISHED THIS WORKED: 
     logger.exception("Something happened when trying" 
         " to resolve %s" % ip_subtask.args[0]) 

तो, यही सवाल है ... क्या तर्कों को पुनः प्राप्त करने का कोई तरीका है यदि मेरे पास कार्य उदाहरण स्वयं है तो एक कार्य निष्पादित किया गया था?

अग्रिम धन्यवाद।

+0

आप एक 'on_failure' हैंडलर को देखा है? http://celery.readthedocs.org/en/latest/userguide/tasks.html#on_failure – Ngenator

+0

मेरे पास है, और मुझे लगता है कि यह काम करेगा, लेकिन मुझे नहीं पता कि यह कैसे उपयोग किया जाए जब कार्य के माध्यम से कार्य किया गया हो सजावटकर्ता जैसा ऊपर दिखाया गया है (जैसा कि मैंने कहा था, मैं सेलेरी के साथ नौसिखिया हूं) – BorrajaX

+0

हैंडलर के ऊपर सेक्शन अनुभाग देखें, यह आपको एक अमूर्त वर्ग के साथ ऐसा करने का तरीका दिखाता है। – Ngenator

उत्तर

7

ऐसा करने के लिए आप हैंडलर को लागू करने के लिए abstract class का उपयोग कर सकते हैं।

from celery import Task 

class DebugTask(Task): 
    abstract = True 

    def on_failure(self, exc, task_id, args, kwargs, einfo): 
     logger.exception("Something happened when trying" 
         " to resolve %s" % args[0]) 

@tasks_app.task(base=DebugTask) 
def resolve_hostname(hostname): 
    return (hostname, {hst.address for hst in dns.resolver.query(hostname)}) 

डॉक्स से:

on_failure(self, exc, task_id, args, kwargs, einfo) 

Parameters: 
    exc  – The exception raised by the task. 
    task_id – Unique id of the failed task. 
    args – Original arguments for the task that failed. 
    kwargs – Original keyword arguments for the task that failed. 
    einfo – ExceptionInfo instance, containing the traceback. 
संबंधित मुद्दे