【问题标题】:acquire inside a try block在 try 块内获取
【发布时间】:2023-03-23 12:57:01
【问题描述】:

我正在编写一本开源的中级 Python 书籍,并阅读了许多 PEP。在PEP310 中,有一个关于“with”语句的旧提案。该提议最终被拒绝,但下面的语句让我印象深刻:“另一个常见的错误是在 try 块中编写“获取”调用,如果获取失败,它会错误地释放锁。”

有人可以详细说明将获取放在 try 中会如何改变事情吗?据我了解,Python 中的获取调用只是返回一个布尔值,指示是否成功获取了锁,那么将它放在 try 块中会如何改变呢?

【问题讨论】:

    标签: python locks


    【解决方案1】:

    我相信这就是它所指的:

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

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

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

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

    无论文档是否建议调用引发异常,您都应该始终编写代码以应对异常。没有什么可以阻止未来行为的改变。

    【讨论】:

    • OP 的观点是至少threading.Lock.acquire 没有提出(或至少没有记录到)。
    • @delnan 这不是错误编码的原因。假设任何调用都可能引发异常。
    • 是的,但是只有在获得锁之前引发的异常才会导致所描述的错误。并且 some 假设 some 操作是保存 必须 进行的。
    • @delnan 我不明白为什么 OP 如此确定 Lock.acquire 不会引发异常。布尔结果与异常情况下调用失败无关。
    • @delnan 这个问题与锁的具体实现无关。再看看 OP 链接的 PEP。
    猜你喜欢
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    • 2017-07-20
    • 1970-01-01
    • 2017-04-16
    相关资源
    最近更新 更多