Назад к подготовке

Для чего нужны 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.