Check

Семантика контекста менеджера блокировок

Python Senior Яндекс
Как правильно использовать блокировки (`threading.Lock`, `RLock`) в Python, чтобы избежать дедлоков? Приведите пример с контекстным менеджером.
Ответы
Lock и RLock
Лучше всего использовать блокировки через контекстный менеджер `with`, чтобы гарантировать их освобождение даже при исключении. Пример: ```python import threading lock = threading.Lock() counter = 0 def worker(): global counter with lock: tmp = counter tmp += 1 counter = tmp ``` Чтобы избежать дедлоков: - следовать единому порядку захвата нескольких блокировок во всех потоках; - минимизировать время удержания lock; - по возможности использовать более высокоуровневые примитивы (Queue, concurrent.futures).