2015-03-31 1 views
6

Angenommen, ich habe ein threading.Lock() Objekt, das ich erwerben möchte, um eine Ressource zu verwenden. Angenommen, ich möchte eine Klausel try ... except ... mit der Ressource verwenden.Was ist die optimale Verwendung einer Sperre mit einem Versuch ... außer in Python 2.7?

Es gibt mehrere Möglichkeiten, dies zu tun.

Methode 1

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

Wenn ein Fehler auftritt, während der oder do_stuff1()do_stuff2(), wird die Verriegelung gelöst werden? Oder ist es besser, eine der folgenden Methoden zu verwenden?

Methode 2

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

Methode 3

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

Welche Methode für das Schloss am besten auch freigegeben werden, wenn ein Fehler auftritt?

+0

['versuchen: .. außer: pass '] (http://stackoverflow.com/q/21553327/1903116) ist sehr schlecht. – thefourtheye

+0

Ich persönlich bevorzuge die erste Methode ohne 'try..except' – thefourtheye

+4

Dies ist der * ganze Punkt * von' with', der '__exit__' Teil des Context Managers gibt die Sperre frei, egal was passiert. Wenn Sie Fehler bei dem, was Sie damit machen, abfangen wollen, sollte der "try" * innerhalb * der 'mit' sein (Methode 2). – jonrsharpe

Antwort

5

The with"context manager" ein __exit__ Verfahren erfordert, die in diesem Fall, dass gewährleisten, was auch immer geschieht, ist die lockrelease d.

Wenn Sie Ausnahmen behandeln sollen, die während auftreten, was auch immer es ist, dass Sie mit diesen lock tun, sollten Sie den tryinnerhalb des with Block setzen, das heißt Methode 2 ist der richtige Ansatz. Im Allgemeinen sollten Sie immer darauf abzielen, die Menge an Code innerhalb des try Blocks zu minimieren.

Sie sollten auch so genau wie möglich über was könnte schief gehen; eine bare except: ist eine schlechte Praxis (siehe z.B. "the evils of except"). Bei der mindestens (auch für ein einfaches Beispiel!) Sollten Sie except Exception: verwenden.