什么是锁的最佳使用与尝试。。。除了Python 2.7之外?

什么是锁的最佳使用与尝试。。。除了Python 2.7之外?,python,locking,python-multithreading,Python,Locking,Python Multithreading,假设我有一个threading.Lock()对象,我想获取它以使用资源。假设我想使用试试。。。除了带有资源的…子句 有几种方法可以做到这一点 方法1 import threading lock = threading.Lock() try: with lock: do_stuff1() do_stuff2() except: do_other_stuff() 如果在do_stuff1()或do_stuff2()期间发生错误,锁是否会被释放?还是使

假设我有一个
threading.Lock()
对象,我想获取它以使用资源。假设我想使用
试试。。。除了带有资源的…
子句

有几种方法可以做到这一点

方法1

import threading
lock = threading.Lock()
try:
    with lock:
        do_stuff1()
        do_stuff2()
except:
    do_other_stuff()
如果在
do_stuff1()
do_stuff2()
期间发生错误,锁是否会被释放?还是使用以下方法之一更好

方法2

with lock:
    try:
        do_stuff1()
        do_stuff2()
    except:
        do_other_stuff()
方法3

lock.acquire():
try:
    do_stuff1()
    do_stuff2()
except:
    do_other_stuff()
finally:
    lock.release()
哪种方法最适合在发生错误时释放锁?

带的
需要一种
\uuuu退出
方法,在这种情况下,该方法将确保无论发生什么情况,
都是
释放
d

如果要处理在使用该
锁执行任何操作期间发生的异常,应将
try
放在
with
块中,即方法2是正确的方法。通常,您应该始终将
try
块中的代码量最小化


你也应该尽可能明确哪些地方会出错;除了:
之外的裸
是不好的做法(参见示例)。至少(即使是一个简单的例子!)你应该使用
,例外除外:

非常糟糕。我个人更喜欢不使用
try的第1种方法。
除了
这是
的全部要点,上下文管理器的
\uuuuuuu退出
部分无论发生什么情况都会释放锁。如果你想在使用它的过程中发现错误,那么
try
应该在
with
(方法2)中。@Theourtheye这是一个例子,我知道。。。谢谢:-)第一个方法在调用
do\u other\u stuff()
之前释放锁,这样可以减少锁的占用时间,减少争用。也许是最小的因素,但仍然如此。