threading thread stop programa hilos example eliminar detener como python multithreading locking reentrancy

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 ?