Асинхронное программирование в Python — это способ выполнять много I/O‑задач одновременно без запуска десятков потоков. Чаще всего его используют для сетевых запросов, парсеров, ботов, микросервисов и интеграций с API.
Что такое `asyncio`
`asyncio` — стандартная библиотека Python для асинхронного кода. Она работает вокруг цикла событий (event loop), который переключает выполнение между задачами в моменты ожидания: ответа сервера, чтения файла, таймера и т.д.
Основные элементы:
- `async def` — объявление корутины
- `await` — ожидание результата без блокировки программы
- `asyncio.create_task()` — запуск задачи параллельно
- `asyncio.gather()` — ожидание нескольких задач сразу
Пример:
import asyncio
async def hello():
await asyncio.sleep(1)
print("Готово")
asyncio.run(hello())
Зачем нужен `aiohttp`
`aiohttp` — популярная библиотека для асинхронных HTTP-запросов. Если `requests` делает запросы последовательно, то `aiohttp` позволяет отправлять десятки и сотни запросов конкурентно 🚀
Пример:
import asyncio
import aiohttp
async def fetch(url, session):
async with session.get(url) as response:
return await response.text()
async def main():
urls = ["https://example.com", "https://httpbin.org/get"]
async with aiohttp.ClientSession() as session:
tasks = [fetch(url, session) for url in urls]
results = await asyncio.gather(*tasks)
print(results)
asyncio.run(main())
Когда асинхронность полезна
- Массовые HTTP-запросы к API
- Веб-скрапинг и парсинг сайтов
- Telegram-боты и чат-сервисы
- Работа с очередями, сокетами, вебхуками
- Высоконагруженные backend-сервисы 🌐
Когда `asyncio` не поможет
Если задача упирается в CPU: сложные вычисления, обработку видео, ML-инференс, архивирование — асинхронность не даст прироста сама по себе. Для таких кейсов подходят multiprocessing, очереди задач или вынос вычислений в отдельные сервисы 🧠
Частые ошибки
- Использовать `time.sleep()` вместо `await asyncio.sleep()`
- Создавать новую `ClientSession` на каждый запрос
- Смешивать синхронный и асинхронный код без необходимости
- Запускать слишком много запросов без лимитов
- Забывать про таймауты и обработку ошибок
Практические советы
- Ограничивайте число одновременных задач через `Semaphore`
- Повторно используйте одно соединение `ClientSession`
- Добавляйте `timeout` и retry-логику
- Профилируйте код: иногда узкое место не в сети, а в обработке данных 🔍
Итог
`asyncio` и `aiohttp` — мощная связка для Python-разработки, когда нужно эффективно работать с сетью и большим количеством I/O-операций. Они помогают ускорить приложения, снизить потребление ресурсов и сделать код масштабируемым. Главное — понимать, что асинхронность решает задачи ожидания, а не тяжелых вычислений ✅
Подборку каналов про IT стоит посмотреть тем, кто следит за Python, backend, DevOps и актуальными инструментами разработки 📚