← Назад к вопросам
В чём разница между asyncio и aiohttp?
2.3 Middle🔥 241 комментариев
#REST API и HTTP#Асинхронность и многопоточность
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
asyncio vs aiohttp
Это важное различие: asyncio — фундамент, aiohttp — специализированная библиотека.
asyncio — асинхронный фреймворк Python
asyncio — это встроенная библиотека для асинхронного программирования. Она обеспечивает event loop и асинхронные примитивы.
import asyncio
async def hello():
print("Начало")
await asyncio.sleep(1)
print("Конец")
asyncio.run(hello())
Что делает asyncio:
- Event loop — управляет асинхронными задачами
- async/await синтаксис — определяет асинхронные функции
- asyncio.Task — управление задачами
- asyncio.sleep, asyncio.wait — асинхронные примитивы
- asyncio.Queue — безопасные очереди
- Работа с сокетами (low-level)
import asyncio
async def main():
task1 = asyncio.create_task(work(1))
task2 = asyncio.create_task(work(2))
await asyncio.gather(task1, task2)
try:
await asyncio.wait_for(work(3), timeout=5)
except asyncio.TimeoutError:
print("Timeout!")
queue = asyncio.Queue()
await queue.put("item")
item = await queue.get()
async def work(n):
await asyncio.sleep(n)
return f"Done {n}"
asyncio.run(main())
aiohttp — асинхронный HTTP клиент и сервер
aiohttp — это специализированная библиотека для работы с HTTP поверх asyncio.
import aiohttp
import asyncio
async def fetch(url):
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
return await response.text()
async def main():
html = await fetch("https://example.com")
print(html)
asyncio.run(main())
Что делает aiohttp:
- HTTP клиент (GET, POST, PUT, DELETE)
- HTTP сервер (веб приложение)
- WebSocket поддержка
- Автоматическое управление соединениями
- Работает поверх asyncio
Сравнительная таблица
| Аспект | asyncio | aiohttp |
|---|---|---|
| Тип | Фреймворк | Библиотека |
| Назначение | Асинхронность вообще | HTTP запросы |
| Зависимость | Встроена в Python | Зависит от asyncio |
| Работает с | Сокеты, таймеры, очереди | HTTP протокол |
| Сервер | Низкоуровневый сокет | Полноценный веб сервер |
| Клиент | Сокеты | HTTP запросы |
| Простота | Требует написания кода | Готовая функциональность |
Практические примеры
asyncio: низкоуровневая асинхронность
import asyncio
async def tcp_client():
reader, writer = await asyncio.open_connection('example.com', 80)
writer.write(b'GET / HTTP/1.1\r\nHost: example.com\r\n\r\n')
await writer.drain()
data = await reader.read(1024)
print(data.decode())
writer.close()
await writer.wait_closed()
asyncio.run(tcp_client())
aiohttp: высокоуровневая работа с HTTP
import aiohttp
import asyncio
async def http_client():
async with aiohttp.ClientSession() as session:
async with session.get('https://example.com') as response:
html = await response.text()
print(html)
asyncio.run(http_client())
Сравнение кода:
# asyncio (низкоуровневый)
reader, writer = await asyncio.open_connection(host, port)
writer.write(raw_http_request)
response = await reader.read(1024)
# aiohttp (высокоуровневый)
async with session.get(url) as response:
data = await response.json()
asyncio для разных задач
import asyncio
async def timer():
await asyncio.sleep(2)
print("Готово!")
async def gather_tasks():
results = await asyncio.gather(
task1(),
task2(),
task3()
)
return results
async def with_timeout():
try:
result = await asyncio.wait_for(long_operation(), timeout=5)
except asyncio.TimeoutError:
print("Timeout!")
async def queue_processing():
queue = asyncio.Queue()
async def producer():
for i in range(10):
await queue.put(i)
async def consumer():
while not queue.empty():
item = await queue.get()
print(f"Обработал {item}")
await asyncio.gather(producer(), consumer())
asyncio.run(main())
aiohttp для веб приложений
from aiohttp import web
import asyncio
async def hello(request):
return web.Response(text="Hello, World!")
async def json_endpoint(request):
data = await request.json()
return web.json_response({"received": data})
async def start_server():
app = web.Application()
app.router.add_get('/', hello)
app.router.add_post('/api', json_endpoint)
runner = web.AppRunner(app)
await runner.setup()
site = web.TCPSite(runner, 'localhost', 8080)
await site.start()
print("Сервер запущен")
asyncio.run(start_server())
Как они связаны
import asyncio
import aiohttp
async def example():
loop = asyncio.get_event_loop()
async with aiohttp.ClientSession() as session:
async with session.get('https://api.example.com') as response:
data = await response.json()
return data
asyncio.run(example())
Когда использовать что
asyncio используй для:
- Асинхронные операции в целом
- Работа с сокетами
- Таймеры и задержки
- Управление задачами
- Низкоуровневая асинхронность
- Фундамент для других библиотек
aiohttp используй для:
- HTTP запросы (GET, POST и т.д.)
- Веб скрапинг
- Работа с REST API
- WebSocket соединения
- Создание асинхронного сервера
- Быстро и просто
Реальный пример: параллельные запросы
import aiohttp
import asyncio
async def fetch_url(session, url):
async with session.get(url) as response:
return await response.text()
async def fetch_all(urls):
async with aiohttp.ClientSession() as session:
tasks = [fetch_url(session, url) for url in urls]
results = await asyncio.gather(*tasks)
return results
async def main():
urls = [
'https://example.com',
'https://example.org',
'https://example.net'
]
results = await fetch_all(urls)
for url, result in zip(urls, results):
print(f"{url}: {len(result)} bytes")
asyncio.run(main())
Важный вывод
- asyncio — встроенный event loop и асинхронные примитивы
- aiohttp — HTTP библиотека, которая использует asyncio
- Почти все асинхронные библиотеки (asyncpg, aioredis) работают поверх asyncio
- Если нужны HTTP запросы — используй aiohttp
- Если нужна общая асинхронность — используй asyncio