python - thread - Cuál es la diferencia entre Lock y RLock
thread python 3 (1)
La principal diferencia es que un Lock
solo se puede adquirir una vez. No se puede volver a adquirir hasta que se libere. (Después de haber sido lanzado, puede volver a ser adquirido por cualquier hilo).
Un RLock
por otro lado, puede adquirirse varias veces, por el mismo hilo. Necesita ser lanzado el mismo número de veces para ser "desbloqueado".
Otra diferencia es que un Lock
adquirido puede ser liberado por cualquier hilo, mientras que un RLock
adquirido RLock
puede ser liberado por el hilo que lo adquirió.
Aquí hay un ejemplo que demuestra por qué RLock
es útil a veces. Supongamos que tiene:
def f():
g()
h()
def g():
h()
do_something1()
def h():
do_something2()
Digamos que todos f
, g
y h
son públicos (es decir, que un llamador externo puede llamarlos directamente) y todos requieren sincronización.
Usando un Lock
, puedes hacer algo como:
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()
Básicamente, como f
no puede invocar g
después de adquirir el bloqueo, necesita llamar a una versión "en bruto" de g
(es decir, _g
). Así que terminas con una versión "sincronizada" y una versión "en bruto" de cada función.
El uso de RLock
resuelve elegantemente el problema:
lock = RLock()
def f():
with lock:
g()
h()
def g():
with lock:
h()
do_something1()
def h():
with lock:
do_something2()
De los docs :
threading.RLock () - Una función de fábrica que devuelve un nuevo objeto de bloqueo reentrante. Un bloqueo de reentrada debe ser liberado por el hilo que lo adquirió. Una vez que un hilo ha adquirido un bloqueo de reentrada, el mismo hilo puede adquirirlo nuevamente sin bloqueo; el hilo debe liberarlo una vez por cada vez que lo haya adquirido.
No estoy seguro de por qué necesitamos esto? ¿ Rlock
es la diferencia entre Rlock
y Lock
?