asyncio.Event()
можно заставить асинхронные задачи ждать, пока не произойдет определенное событие. Одна задача вызывает await event.wait()
и блокируется, пока другая задача не вызовет event.set()
. event.set()
разблокирует все ожидающие задачи, и они продолжат выполнение. Для сброса события используется event.clear()
. Это полезно для координации между задачами, например, для сигнализации о готовности данных или завершении этапа обработки.
Синхронизация асинхронных задач с использованием asyncio.Event()
позволяет корутинам ждать наступления определенного события, прежде чем продолжить выполнение. asyncio.Event()
работает как флаг, который может быть установлен (set) или сброшен (unset). Корутины, ожидающие этого события, блокируются до тех пор, пока событие не будет установлено.
Вот как это работает:
asyncio.Event()
.await event.wait()
для приостановки своего выполнения до тех пор, пока событие не будет установлено. Если событие уже установлено, wait()
возвращается немедленно.event.set()
для установки события. Как только событие установлено, все корутины, ожидающие этого события, освобождаются и начинают выполняться.event.clear()
сбрасывает событие, возвращая его в состояние "не установлено". Это позволяет другим корутинам снова ждать этого события.Пример использования:
import asyncio
async def worker(event, worker_id):
print(f"Worker {worker_id}: Ожидание события...")
await event.wait()
print(f"Worker {worker_id}: Событие произошло! Продолжаю работу.")
async def main():
event = asyncio.Event()
# Создаем несколько воркеров
workers = [asyncio.create_task(worker(event, i)) for i in range(3)]
# Даем воркерам время запуститься и начать ожидание
await asyncio.sleep(1)
print("Устанавливаем событие...")
event.set()
# Ждем завершения воркеров
await asyncio.gather(*workers)
if __name__ == "__main__":
asyncio.run(main())
Объяснение примера:
worker
принимает asyncio.Event
и ID воркера. Она выводит сообщение об ожидании события, а затем приостанавливается с помощью await event.wait()
. Когда событие будет установлено, воркер продолжит выполнение и выведет сообщение о продолжении работы.main
создает экземпляр asyncio.Event
и три таски-воркера. После небольшой задержки, позволяющей воркерам начать ожидание, main
устанавливает событие с помощью event.set()
.asyncio.gather(*workers)
ожидает завершения всех задач-воркеров.В каких случаях это полезно:
Важно: Убедитесь, что событие устанавливается только один раз, если это требуется. Если вам нужно, чтобы событие происходило несколько раз, сбрасывайте его с помощью event.clear()
после обработки.