2014-04-05 20 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()