在try块中获取

Vfo*_*ent 2 python locks

我正在研究一本开源的中级Python书籍,并讨论了许多PEP.在PEP310中,有一个关于"with"语句的旧提议.该提议最终被驳回,但以下声明让我感到震惊:"另一个常见错误是在try块内编码"acquire"调用,如果获取失败,则会错误地释放锁定."

有人可以详细说明如何将获取置于试验中改变事物吗?根据我的理解,在Python中获取调用只返回一个布尔值,指示锁是否已成功获取,那么如何将它放入try块中更改内容?

Ste*_*yne 6

我相信这就是它所指的:

try:
    lock.acquire()
finally:
    lock.release()
Run Code Online (Sandbox Code Playgroud)

如果acquire()引发异常,release()将被调用,即使acquire()没有成功.调用release()当前未锁定的锁可能会引发另一个异常,即仅与问题根源间接相关的异常.

编写块的正确方法是使用with,或者:

lock.acquire()
try:
    ...
finally:
    lock.release()
Run Code Online (Sandbox Code Playgroud)

您应始终编码以满足异常,无论文档是否表明呼叫引发了异常.没有什么可以阻止将来的行为改变.