31
之間從docs的區別:()是什麼鎖和RLOCK
threading.RLock - 一個工廠函數返回一個新的重入鎖對象。重入鎖必須由獲取它的線程釋放。一旦一個線程獲得了一個可重入的鎖,同一個線程可以再次獲得它而不會阻塞;線程每次獲取它時都必須釋放一次。
我不知道爲什麼我們需要這個? 什麼Rlock
和Lock
之間的區別?
感謝
之間從docs的區別:()是什麼鎖和RLOCK
threading.RLock - 一個工廠函數返回一個新的重入鎖對象。重入鎖必須由獲取它的線程釋放。一旦一個線程獲得了一個可重入的鎖,同一個線程可以再次獲得它而不會阻塞;線程每次獲取它時都必須釋放一次。
我不知道爲什麼我們需要這個? 什麼Rlock
和Lock
之間的區別?
感謝
的主要區別在於一個Lock
只能使用一次獲取。它不能再獲得,直到它被釋放。 (它被釋放後,可以被任何線程重新獲得)。
在另一方面的RLock
,可以由同一個線程來獲取多次。它需要被釋放相同的次數才能被「解鎖」。
另一個不同之處在於,獲得的Lock
可以被任何線程釋放,而獲得的RLock
只能由獲得它的線程釋放。
下面是一個例子demostrating爲什麼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()