gpt4 book ai didi

python - Lock和RLock有什么区别

转载 作者:IT老高 更新时间:2023-10-28 20:31:31 32 4
gpt4 key购买 nike

来自 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.

我不确定我们为什么需要这个?RlockLock 有什么区别?

最佳答案

主要区别在于Lock只能获取一次。它不能再次获得,直到它被释放。 (发布后,任何线程都可以重新获取)。

另一方面,RLock 可以被同一个线程多次获取。它需要释放相同的次数才能“解锁”。

另一个区别是,获取的Lock可以被任何线程释放,而获取的RLock只能被获取它的线程释放。


这是一个示例,说明为什么 RLock 有时很有用。假设你有:

def f():
g()
h()

def g():
h()
do_something1()

def h():
do_something2()

假设所有 fgh 都是 public (即可以直接调用外部调用者),所有这些都需要同步。

使用 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()

关于python - Lock和RLock有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22885775/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com