正如每个优秀的开发人员都知道的那样,混合异常管理和线程安全调用总是精致。
我第一次在 Python 中处理这种情况。
我知道在Python 2.5及更高版本中,可以使用with
语句,如下所示:
当与锁一起使用时,此语句会自动获取锁 在进入区块之前,在离开区块时将其释放:
from __future__ import with_statement # 2.5 only with lock: ... access shared resource
考虑此示例代码:
from __future__ import with_statement
import threading
def static_vars(**kwargs):
def decorate(func):
for k in kwargs:
setattr(func, k, kwargs[k])
return func
return decorate
lock = threading.Lock();
@static_vars(counter = 0)
def ts_increment():
with lock:
try:
// something else, also thread-safe
ts_increment.counter += 1
except:
raise
如果raise
语句捕获并重新抛出异常,是否会释放 lock ?
答案 0 :(得分:1)
是的,如果在with语句中引发异常,则锁定将被释放。
>>> import threading
>>> l = threading.Lock()
>>> with l:
raise
Traceback (most recent call last):
File "<pyshell#4>", line 2, in <module>
raise
RuntimeError: No active exception to reraise
>>> l.acquire() # see if we can lock the lock.
True
旁注:如果您查看with语句的工作,则在输入语句时会调用l.__enter__
,并且在退出时始终会调用l.__exit__
并显示错误信息或None
。请参阅pep 343部分&#34;规范:&#39; with&#39;语句&#34;