在try块中获取

时间:2013-01-03 11:00:04

标签: python locks

我正在开发一本开源的中级Python书籍并经历了许多PEP。在PEP310中,有一条旧的“with”语句提案。该提案最终被拒绝,但以下声明让我感到震惊:“另一个常见错误是在try块中编码”acquire“调用,如果获取失败,则会错误地释放锁定。”

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

1 个答案:

答案 0 :(得分:6)

我相信这就是它所指的:

try:
    lock.acquire()
finally:
    lock.release()

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

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

lock.acquire()
try:
    ...
finally:
    lock.release()

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