← Назад к вопросам

В чём разница между 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

Сравнительная таблица

Аспектasyncioaiohttp
ТипФреймворкБиблиотека
НазначениеАсинхронность вообще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
В чём разница между asyncio и aiohttp? | PrepBro