все Python 3threadingпонятие
threading.RLock
синхронизация
Реентрантный мьютекс — один поток может захватить его несколько раз без блокировки. Используй вместо Lock при рекурсивных вызовах.
Синтаксис
rlock = threading.RLock()
with rlock: ...
Считает глубину захвата: сколько раз поток вызвал acquire(), столько же должен вызвать release(), и только тогда лок освободится — забытый release оставит его занятым, а освободить может лишь поток-владелец. От взаимной блокировки между разными потоками RLock не спасает: он лечит только повторный захват внутри одного потока и стоит чуть дороже обычного Lock, так что без реальной реентрантности бери Lock.
Примеры
import threading
rlock = threading.RLock()
def recursive(n):
with rlock:
if n > 0:
recursive(n - 1) # Lock здесь бы заблокировал
print(n)
recursive(3)
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности