asyncio — стандартная библиотека Python для написания конкурентного кода с использованием синтаксиса async/await. В этой статье рассмотрим практические сценарии применения.
Когда нужен asyncio?
asyncio отлично подходит для I/O-bound задач: HTTP-запросов, работы с базами данных, чтения файлов. Если ваш код большую часть времени ждёт ответа от сети или диска — asyncio даст заметный прирост производительности.
Для CPU-bound задач (вычисления, обработка данных) лучше использовать multiprocessing.
Базовый пример
import asyncio
import aiohttp
async def fetch(session, url):
async with session.get(url) as response:
return await response.text()
async def main():
urls = ["https://example.com", "https://python.org"]
async with aiohttp.ClientSession() as session:
tasks = [fetch(session, url) for url in urls]
results = await asyncio.gather(*tasks)
return results
asyncio.run(main())
Ключевые концепции
async def— объявление корутины. Вызов корутины не запускает её немедленно.await— приостанавливает выполнение текущей корутины до получения результата.asyncio.gather()— запускает несколько корутин конкурентно и ждёт завершения всех.asyncio.create_task()— запускает корутину в фоне, не дожидаясь её завершения немедленно.
Интеграция с веб-фреймворками
FastAPI нативно поддерживает async/await. Flask 2.x также поддерживает асинхронные представления, но требует установки flask[async].
Практический совет
Не смешивайте синхронный и асинхронный код без необходимости. Если вы используете синхронную библиотеку внутри asyncio, оборачивайте вызов в loop.run_in_executor(), чтобы не блокировать event loop.