除了 Python 2.7 之外,使用 try ... 锁的最佳用法是什么?
What is the optimal use of a lock with a try ... except in Python 2.7?
假设我有一个 threading.Lock()
对象,我想获取它以使用资源。假设我想对资源使用 try ... except ...
子句。
有几种方法可以做到这一点。
方法一
import threading
lock = threading.Lock()
try:
with lock:
do_stuff1()
do_stuff2()
except:
do_other_stuff()
如果在do_stuff1()
或do_stuff2()
期间出现错误,是否会释放锁?还是使用以下方法之一更好?
方法二
with lock:
try:
do_stuff1()
do_stuff2()
except:
do_other_stuff()
方法三
lock.acquire():
try:
do_stuff1()
do_stuff2()
except:
do_other_stuff()
finally:
lock.release()
即使出错也能解除锁哪种方法最好?
with
"context manager" 需要一个 __exit__
方法,在这种情况下,这将确保无论发生什么,lock
都是 release
d。
如果你想处理在你正在做的任何事情中发生的异常 lock
,你应该把 try
放在 里面with
块,即方法 2 是正确的方法。通常,您应该始终以尽量减少 try
块中的代码量为目标。
您还应该尽可能具体地说明可能会出错的地方;裸露的 except:
是不好的做法(参见 "the evils of except
")。 至少(即使是一个简单的例子!)你应该使用except Exception:
.
假设我有一个 threading.Lock()
对象,我想获取它以使用资源。假设我想对资源使用 try ... except ...
子句。
有几种方法可以做到这一点。
方法一
import threading
lock = threading.Lock()
try:
with lock:
do_stuff1()
do_stuff2()
except:
do_other_stuff()
如果在do_stuff1()
或do_stuff2()
期间出现错误,是否会释放锁?还是使用以下方法之一更好?
方法二
with lock:
try:
do_stuff1()
do_stuff2()
except:
do_other_stuff()
方法三
lock.acquire():
try:
do_stuff1()
do_stuff2()
except:
do_other_stuff()
finally:
lock.release()
即使出错也能解除锁哪种方法最好?
with
"context manager" 需要一个 __exit__
方法,在这种情况下,这将确保无论发生什么,lock
都是 release
d。
如果你想处理在你正在做的任何事情中发生的异常 lock
,你应该把 try
放在 里面with
块,即方法 2 是正确的方法。通常,您应该始终以尽量减少 try
块中的代码量为目标。
您还应该尽可能具体地说明可能会出错的地方;裸露的 except:
是不好的做法(参见 "the evils of except
")。 至少(即使是一个简单的例子!)你应该使用except Exception:
.