Python Glossary English

все 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Сообщить о неточности