当线程尝试再次获取它已经持有的递归锁时,rlock.acquire()
允许线程继续并且不阻塞线程。
另一方面,当线程试图获取它已经持有的常规锁时,则该线程仅被卡在死锁中。
在我看来,第二种情况似乎只是一种麻烦,因为这种情况无法轻易恢复(线程只是卡在lock.acquire()
上),而且很难诊断(无例外)被抛出或其他任何东西,线程只是卡住了。
到目前为止,我已经见过好几次了,实际上有人确实想使用RLock
,但是使用常规的Lock
并花了一些时间调试该问题。另一方面,我从未遇到过Lock
实际上会更好的情况。可以说,当代码的某个真正关键部分不应一次被同一线程两次访问时,可以使用它,但是要想做到这一点,关键部分内部的代码需要自己调用,这将是一件很重要的事情。对程序员来说应该很明显。
因此,在任何情况下,Lock
比RLock
更好吗?如果不是这样,语言设计人员是否应该继续提供常规的Lock
?
答案 0 :(得分:1)
假设这些是Python锁定对象,则文档显示它们完全不同。两者之间的主要区别是:
因此,锁允许您构建线程方案,其中该锁在一个线程中获得而在另一线程中释放。一个示例可能是处理某项工作的线程管道,工作分发者获得了锁,但它是由管道中的最后一个线程释放的。