RLock比Lock更合理吗?

16 投票
2 回答
4451 浏览
提问于 2025-04-15 16:32

Python中的线程模块提供了两种锁:一种是普通锁(Lock),另一种是可重入锁(RLock)。我觉得如果我需要使用锁的话,应该总是选择可重入锁,因为这样可以避免死锁的情况。

除此之外,我认为有两个情况是选择普通锁而不是可重入锁的:

  • 可重入锁的内部结构比较复杂,因此可能性能会更差。
  • 出于某种原因,我想要防止一个线程在锁内进行递归调用。

我的想法对吗?你能指出其他方面吗?

2 个回答

4

通常情况下,你应该把代码写得很清晰,这样在正常运行时就不需要递归锁定(也就是说,你应该把锁紧紧围绕着那些需要保护的数据结构)。所以,你需要能够捕捉到异常的递归锁定情况。

10

有两点需要注意:

  • 在正式发布的Python版本中(比如2.4、2.5一直到3.1),RLock的速度比Lock慢很多,因为Lock是用C语言实现的,而RLock是用Python写的(这个情况在3.2版本会改变)。
  • Lock可以被任何线程释放(不一定是获取它的那个线程),而RLock必须由获取它的同一个线程来释放。

总的来说,我建议只有在你需要RLock的特性时再使用它,否则默认使用Lock就可以了。

撰写回答