31
之间从docs的区别:()是什么锁和RLOCK
threading.RLock - 一个工厂函数返回一个新的重入锁对象。重入锁必须由获取它的线程释放。一旦一个线程获得了一个可重入的锁,同一个线程可以再次获得它而不会阻塞;线程每次获取它时都必须释放一次。
我不知道为什么我们需要这个? 什么Rlock
和Lock
之间的区别?
感谢
之间从docs的区别:()是什么锁和RLOCK
threading.RLock - 一个工厂函数返回一个新的重入锁对象。重入锁必须由获取它的线程释放。一旦一个线程获得了一个可重入的锁,同一个线程可以再次获得它而不会阻塞;线程每次获取它时都必须释放一次。
我不知道为什么我们需要这个? 什么Rlock
和Lock
之间的区别?
感谢
的主要区别在于一个Lock
只能使用一次获取。它不能再获得,直到它被释放。 (它被释放后,可以被任何线程重新获得)。
在另一方面的RLock
,可以由同一个线程来获取多次。它需要被释放相同的次数才能被“解锁”。
另一个不同之处在于,获得的Lock
可以被任何线程释放,而获得的RLock
只能由获得它的线程释放。
下面是一个例子demostrating为什么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()