2015-03-31 4 views
6

मान लीजिए कि मेरे पास threading.Lock() ऑब्जेक्ट है जिसे मैं संसाधन का उपयोग करने के लिए अधिग्रहण करना चाहता हूं। मान लीजिए कि मैं संसाधन के साथ try ... except ... खंड का उपयोग करना चाहता हूं।कोशिश के साथ ताला का इष्टतम उपयोग क्या है ... पायथन 2.7 को छोड़कर?

ऐसा करने के कई तरीके हैं।

विधि 1

import threading 
lock = threading.Lock() 
try: 
    with lock: 
     do_stuff1() 
     do_stuff2() 
except: 
    do_other_stuff() 

do_stuff1() या do_stuff2() के दौरान कोई त्रुटि होती है, तो लॉक जारी किया जाएगा? या क्या निम्न विधियों में से एक का उपयोग करना बेहतर है?

विधि 2

with lock: 
    try: 
     do_stuff1() 
     do_stuff2() 
    except: 
     do_other_stuff() 

विधि 3

lock.acquire(): 
try: 
    do_stuff1() 
    do_stuff2() 
except: 
    do_other_stuff() 
finally: 
    lock.release() 

जो विधि ताला लिए सबसे अच्छा है एक त्रुटि तब होती है, भले ही जारी होने की?

+0

['कोशिश करें: .. को छोड़कर: पास'] (http://stackoverflow.com/q/21553327/1903116) बहुत खराब है। – thefourtheye

+0

मैं व्यक्तिगत रूप से 'try..except' – thefourtheye

+4

के बिना 1 विधि को प्राथमिकता देता हूं, यह' के साथ 'का पूरा बिंदु * है, संदर्भ प्रबंधक के' __exit__' भाग जो कुछ भी होता है उसे लॉक करता है। यदि आप इसके साथ जो कुछ भी करते हैं उसमें त्रुटियों को पकड़ना चाहते हैं, तो 'try' * के साथ 'विधि' होना चाहिए (विधि 2)। – jonrsharpe

उत्तर

5

with"context manager" एक __exit__ विधि, जो इस मामले में यह सुनिश्चित करेंगे की आवश्यकता है, जो कुछ भी होता है, lockrelease घ है।

आप अपवाद कि जो कुछ भी यह है कि आप उस lock साथ क्या कर रहे है के दौरान हो हैंडल करना चाहते हैं, तो आप try अंदर with ब्लॉक डाल चाहिए, जैसे कि विधि 2 सही दृष्टिकोण है। आम तौर पर, आपको हमेशा try ब्लॉक के भीतर कोड की मात्रा को कम करने का लक्ष्य रखना चाहिए।

आपको के बारे में जितना संभव हो उतना सटीक होना चाहिए; एक नंगे except: खराब अभ्यास है (उदाहरण के लिए "the evils of except" देखें)। पर बहुत कम (यहां तक ​​कि एक साधारण उदाहरण के लिए भी!) आपको except Exception: का उपयोग करना चाहिए।

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