Вопрос охватывает инструменты для синхронизации корутин в asyncio.
Основные примитивы:
Lock — блокировка для исключительного доступа
Event — уведомление между корутинами
Semaphore — ограничение числа одновременных операций
Condition — сложные условия ожидания
1. Lock (блокировка):
lock = asyncio.Lock()
async def safe_update():
async with lock: # Только одна корутина за раз
# Критическая секция2. Event (событие):
event = asyncio.Event()
async def waiter():
await event.wait() # Ждём сигнала
print("Событие произошло!")
async def setter():
await asyncio.sleep(1)
event.set() # Разблокирует всех waiters3. Semaphore (семафор):
sem = asyncio.Semaphore(3) # Макс 3 одновременных вызова
async def limited_task():
async with sem:
await heavy_operation()Вывод:
Выбор примитива зависит от сценария синхронизации.