Короткий ответ
Ключевые слова async и await позволяют писать асинхронный код: функция async def становится корутиной, а await приостанавливает её до готовности ожидаемого объекта, возвращая управление циклу событий.
Как это работает подробнее
При вызове корутина не исполняет тело, а возвращает объект корутины, который должен работать внутри цикла событий asyncio.
- Корутина. Функция, объявленная через async def; без await или asyncio.run() её код не выполнится.
- Ожидание. await приостанавливает корутину до завершения другой корутины, asyncio-задачи или Future.
- Конкурентность. Пока одна корутина ждёт сеть или диск, цикл событий выполняет другие корутины.
- Запуск. Стандартный вход в асинхронную программу — asyncio.run(), либо await из другой корутины.
Пример кода
Запуск корутины через asyncio.run
import asyncio
async def greet():
print('Hello')
asyncio.run(greet()) # вывод: HelloЧто использовать на практике
- Точка входа. Запускай верхнеуровневую корутину через asyncio.run().
- Группировка задач. Запускай несколько корутин конкурентно через asyncio.gather().
- Тайм-ауты. Ограничивай долгие ожидания через asyncio.wait_for().
Подводные камни
- Забытый await. Вызов корутины без await возвращает объект корутины и предупреждение, а не результат.
- Блокирующий код. time.sleep() внутри корутины заморозит весь цикл событий: используй asyncio.sleep().