Python 在试块内获得

Python 在试块内获得,python,locks,Python,Locks,我正在写一本开放源码的中间版Python书籍,并复习了一些PEP。在中,有一个关于“with”语句的老建议。这个提议最终被拒绝了,但下面的陈述让我震惊:“另一个常见错误是在try块中对“acquire”调用进行编码,如果acquire失败,它会错误地释放锁。” 有人能详细说明一下,把收购放在try中是如何改变事情的吗?据我所知,Python中的acquire调用只返回一个布尔值,指示是否成功获取了锁,那么将其放入try块如何改变情况呢?我相信这就是它所指的: try: lock.acqu

我正在写一本开放源码的中间版Python书籍,并复习了一些PEP。在中,有一个关于“with”语句的老建议。这个提议最终被拒绝了,但下面的陈述让我震惊:“另一个常见错误是在try块中对“acquire”调用进行编码,如果acquire失败,它会错误地释放锁。”


有人能详细说明一下,把收购放在try中是如何改变事情的吗?据我所知,Python中的acquire调用只返回一个布尔值,指示是否成功获取了锁,那么将其放入try块如何改变情况呢?

我相信这就是它所指的:

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

写入块的正确方法是将
一起使用,或者:

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

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

OP的观点是,至少
threading.Lock.acquire
不会引发(或者至少没有文档记录)。@delnan这不是错误编码的原因。假设任何调用都可以引发异常。是的,但只有在获取锁之前引发的异常才会导致所述错误。必须做出一些假设,即某些操作是保存的。@delnan我不明白为什么OP如此确定
Lock.acquire
不会引发异常。布尔结果与异常情况下调用失败无关。@delnan这个问题与锁的具体实现无关。再看看OP链接的政治公众人物。