从docs:
threading.RLock() —
A factory function that returns a new reentrant lock object. A reentrant lock must be released by the thread that acquired it. Once a thread has acquired a reentrant lock, the same thread may acquire it again without blocking; the thread must release it once for each time it has acquired it.
我不知道为什么我们需要这个?
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()