Как правильно использовать блокировки (`threading.Lock`, `RLock`) в Python, чтобы избежать дедлоков? Приведите пример с контекстным менеджером.
Lock и RLock
Ответ 1 / 1
Лучше всего использовать блокировки через контекстный менеджер `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).