除了Python 2.7之外,试用锁的最佳用途是什么?

Jul*_*nck 8 python locking python-multithreading

假设我有一个threading.Lock()我想要获取的对象以便使用资源.假设我想try ... except ...在资源中使用一个子句.

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

方法1

import threading
lock = threading.Lock()
try:
    with lock:
        do_stuff1()
        do_stuff2()
except:
    do_other_stuff()
Run Code Online (Sandbox Code Playgroud)

如果在do_stuff1()或期间发生错误do_stuff2(),是否会释放锁定?或者使用以下方法之一是否更好?

方法2

with lock:
    try:
        do_stuff1()
        do_stuff2()
    except:
        do_other_stuff()
Run Code Online (Sandbox Code Playgroud)

方法3

lock.acquire():
try:
    do_stuff1()
    do_stuff2()
except:
    do_other_stuff()
finally:
    lock.release()
Run Code Online (Sandbox Code Playgroud)

即使发生错误,哪种方法最适合释放锁?

jon*_*rpe 8

with "上下文管理器"要求的__exit__方法,在这种情况下可以保证,无论发生什么事,该lockreleased.

如果你想处理期间不管它是什么,你有这样做发生的异常lock,你应该把try 内部with块,即方法2是正确的做法.通常,您应始终致力于最小化try块内的代码量.

你应该尽可能具体地说明可能出现的问题; 裸露except:是不好的做法(参见例如"邪恶的except").在最起码(即使是一个简单的例子!),你应该使用except Exception:.