从文档:
threading.RLock()-一种工厂函数,返回一个新的可重入锁对象。可重入锁必须由获取它的线程释放。一旦线程获取了可重入锁,同一线程就可以再次获取它而不会阻塞;线程必须在每次获取它后释放一次。
我不确定为什么我们需要这个?Rlock和之间有什么区别Lock?
Rlock
Lock
主要区别在于aLock只能获取一次。在发布之前,无法再次获取它。(发布后,任何线程都可以重新获取它)。
一个RLock在另一方面,可以由同一个线程来获取多次。它需要被释放相同的次数才能被“解锁”。
RLock
另一个区别是,获取对象Lock可以由任何线程释放,而获取对象RLock只能由获取它的线程释放。
这是一个示例,说明为什么RLock有时有用。假设您有:
def f(): g() h() def g(): h() do_something1() def h(): do_something2()
比方说,所有的f,g和h有 公共 (即可以直接由外部调用程序调用),所有这些都需要同步化。
f
g
h
使用Lock,您可以执行以下操作:
lock = Lock() def f(): with lock: _g() _h() def g(): with lock: _g() def _g(): _h() do_something1() def h(): with lock: _h() def _h(): do_something2()
基本上,因为f不能调用g获取锁后,它需要调用的“原始”版本g(即_g)。因此,您最终获得了每个功能的“同步”版本和“原始”版本。
_g
使用一个RLock优雅解决了这个问题:
lock = RLock() def f(): with lock: g() h() def g(): with lock: h() do_something1() def h(): with lock: do_something2()