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?
['versuchen: .. außer: pass '] (http://stackoverflow.com/q/21553327/1903116) ist sehr schlecht. – thefourtheye
Ich persönlich bevorzuge die erste Methode ohne 'try..except' – thefourtheye
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