Короткий ответ
asyncio — библиотека для написания однопоточного конкурентного кода на основе цикла событий; async def объявляет корутину, а await приостанавливает её выполнение до завершения ожидаемой операции, позволяя циклу событий выполнять другие корутины.
Как это работает подробнее
Корутина, объявленная через async def, при вызове не выполняется сразу, а создаёт объект-корутину; её нужно запустить через event loop (asyncio.run). await передаёт управление обратно циклу событий на время ожидания операции, и цикл может выполнять другие готовые корутины.
Пример кода
example-257.py
import asyncio
async def fetch_data(delay, name):
print(f"{name}: начало")
await asyncio.sleep(delay) # имитация сетевого ожидания, не блокирует другие корутины
print(f"{name}: готово")
return name
async def main():
results = await asyncio.gather(fetch_data(1, "A"), fetch_data(1, "B"))
print(results)
asyncio.run(main())
# Проверка: обе задачи стартуют почти одновременно и завершаются суммарно за ~1с, а не за 2сЧто использовать на практике
- Практика.
asyncioэффективен для I/O-bound конкурентности с большим числом одновременных ожиданий, так как позволяет обслуживать тысячи «легковесных» задач в одном потоке без накладных расходов на создание ОС-потоков под каждую.
Подводные камни
- Риски. Считают, что
asyncавтоматически ускоряет CPU-bound вычисления — выигрыш есть только при реальном ожидании (I/O); вызывают корутину безawaitи забывают про предупреждение «coroutine was never awaited».