Ответ
Модуль asyncio предоставляет инфраструктуру для написания однопоточного конкурентного кода с использованием корутин. Ключевые функции:
-
asyncio.run(coro): Высокоуровневая точка входа для запуска асинхронной программы. Автоматически создает и управляет циклом событий (event loop). -
asyncio.create_task(coro): Планирует асинхронную функцию для параллельного (конкурентного) выполнения в цикле событий. Немедленно возвращает объектTask, не дожидаясь завершения корутины. -
asyncio.gather(*aws): Запускает несколько асинхронных операций одновременно и возвращает список их результатов после того, как все они будут завершены. -
asyncio.sleep(delay): Неблокирующая пауза. Приостанавливает выполнение текущей корутины наdelayсекунд, позволяя циклу событий выполнять другие задачи. -
asyncio.wait_for(aw, timeout): Ожидает завершения асинхронной операции с указанным таймаутом. Если время истекло, вызывает исключениеasyncio.TimeoutError. -
asyncio.to_thread(func, *args): Асинхронно запускает блокирующую (синхронную) функцию в отдельном потоке, не блокируя основной цикл событий. Это основной способ интеграции legacy-кода.
Пример использования:
import asyncio
import time
async def fetch_data(source: str):
print(f"Начинаю загрузку из {source}...")
await asyncio.sleep(1) # Имитация I/O операции
print(f"Загрузка из {source} завершена.")
return {"source": source, "data": "..."}
async def main():
start_time = time.time()
# Запускаем обе задачи конкурентно
task1 = asyncio.create_task(fetch_data("API"))
task2 = asyncio.create_task(fetch_data("DB"))
# Ожидаем завершения обеих задач
results = await asyncio.gather(task1, task2)
print(f"Получены результаты: {results}")
end_time = time.time()
print(f"Все операции заняли {end_time - start_time:.2f} секунд.")
# Запускаем основную корутину
asyncio.run(main())
# Вывод покажет, что общее время выполнения ~1 секунда, а не 2.