RLock比Lock更合理吗?
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就可以了。