在Python中混合异常管理和线程安全调用

时间:2015-07-16 12:55:30

标签: python multithreading exception exception-handling

正如每个优秀的开发人员都知道的那样,混合异常管理和线程安全调用总是精致

我第一次在 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

1 个答案:

答案 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;