Для чего нужны asyncio Lock, Event и Semaphore
Объясни разницу между async Lock, Event и Semaphore и где они нужны в backend-коде.
Ответить самому
Сначала сформулируйте ответ как на собеседовании, затем откройте разбор и оцените себя.
Короткий ответ
Lock защищает критическую секцию для одной корутины, Event будит ожидающие корутины по сигналу, Semaphore ограничивает число одновременных операций, например запросов к API или соединений.
Полный разбор
asyncio.Lock нужен, когда несколько корутин могут одновременно менять shared state или выполнять операцию, которую нужно сериализовать. В отличие от thread lock, он не блокирует поток ОС, а при ожидании отдает управление event loop.
asyncio.Event — это флаг/сигнал. Одни корутины ждут event.wait(), другая вызывает event.set(), и ожидающие продолжают работу. Это удобно для readiness signals, shutdown signals или ожидания инициализации ресурса.
asyncio.Semaphore ограничивает concurrency: например, не больше 10 одновременных запросов к внешнему API, не больше N задач обработки или не больше размера пула. Он полезен для backpressure и защиты внешних систем.Теория
Async synchronization primitives нужны не для CPU parallelism, а для координации cooperative tasks внутри event loop и контроля доступа к ресурсам.
Типичные ошибки
- Думать, что async Lock защищает от всех race conditions между процессами.
- Использовать Lock там, где нужен Semaphore для лимита concurrency.
- Не освобождать lock/semaphore через async context manager.
Как отвечать на собеседовании
- Дай по одному примеру на Lock, Event и Semaphore.
- Подчеркни, что ожидание async primitive не блокирует event loop.