Семантика контекста менеджера блокировок
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).