docs:



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

最佳答案

主要区别在于Lock只能获取一次。在发布之前,无法再次获取它。 (发布后,任何线程都可以重新获取它)。

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

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

这是一个示例,说明了为什么RLock有时有用的原因。假设您有:

def f():
  g()
  h()

def g():
  h()
  do_something1()

def h():
  do_something2()

假设fgh都是公开的(即可以由外部调用者直接调用),并且它们都需要同步。

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

09-27 05:30