从docs:
我不确定为什么我们需要这个?Rlock
和Lock
有什么区别?
最佳答案
主要区别在于Lock
只能获取一次。在发布之前,无法再次获取它。 (发布后,任何线程都可以重新获取它)。
另一方面,可以通过同一线程多次获取RLock
。它需要被释放相同的次数才能被“解锁”。
另一个区别是,获取的Lock
可以由任何线程释放,而获取的RLock
只能由获取它的线程释放。
这是一个示例,说明了为什么RLock
有时有用的原因。假设您有:
def f():
g()
h()
def g():
h()
do_something1()
def h():
do_something2()
假设
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
)。因此,您最终获得了每个功能的“同步”版本和“原始”版本。使用
RLock
可以很好地解决此问题:lock = RLock()
def f():
with lock:
g()
h()
def g():
with lock:
h()
do_something1()
def h():
with lock:
do_something2()