python – Lock和RLock有什么区别

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()
上一篇:linux – 发生错误时发布flock?


下一篇:android – HTC Desire中的数据库锁定问题