除了 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 都是 released。

如果你想处理在你正在做的任何事情中发生的异常 lock,你应该把 try 放在 里面with 块,即方法 2 是正确的方法。通常,您应该始终以尽量减少 try 块中的代码量为目标。

您还应该尽可能具体地说明可能会出错的地方;裸露的 except: 是不好的做法(参见 "the evils of except")。 至少(即使是一个简单的例子!)你应该使用except Exception:.