2014-04-05 18 views
31

之间从docs的区别:()是什么锁和RLOCK

threading.RLock - 一个工厂函数返回一个新的重入锁对象。重入锁必须由获取它的线程释放。一旦一个线程获得了一个可重入的锁,同一个线程可以再次获得它而不会阻塞;线程每次获取它时都必须释放一次。

我不知道为什么我们需要这个? 什么RlockLock之间的区别?

感谢

回答

67

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

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

另一个不同之处在于,获得的Lock可以被任何线程释放,而获得的RLock只能由获得它的线程释放。


下面是一个例子demostrating为什么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()