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

Каким классом задач является запрос по сети?

2.0 Middle🔥 151 комментариев
#REST API и HTTP#Асинхронность и многопоточность

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Классификация сетевых запросов

Сетевой запрос по классификации является I/O-bound задачей (Input/Output bound).

Почему I/O-bound?

import time
import requests

# Сетевой запрос - типичная I/O-bound операция
def fetch_data():
    start = time.time()
    response = requests.get("https://api.example.com/data")
    elapsed = time.time() - start
    
    # Большая часть времени - ожидание ответа от сервера
    # CPU практически не используется
    print(f"Time waiting for I/O: {elapsed}s")
    return response.json()

Характеристики I/O-bound задач:

  • CPU простаивает, ждет данных
  • Пропускная способность ограничена сетью/диском, не CPU
  • Можно эффективно использовать многопоточность или asyncio

I/O-bound vs CPU-bound

ТипПримерBottleneckРешение
I/O-boundсетевые запросы, чтение файла, БД запросыСеть/Дискasyncio, threading
CPU-boundвычисления, обработка данныхCPUmultiprocessing, Cython

Решения для сетевых запросов

# 1. Sequential - медленно (ждем каждый запрос)
import requests
import time

start = time.time()
for i in range(5):
    requests.get(f"https://jsonplaceholder.typicode.com/posts/{i}")
print(f"Sequential: {time.time() - start:.2f}s")  # ~5 сек

# 2. Threading - параллельные I/O операции
from concurrent.futures import ThreadPoolExecutor

start = time.time()
with ThreadPoolExecutor(max_workers=5) as executor:
    list(executor.map(
        lambda i: requests.get(f"https://jsonplaceholder.typicode.com/posts/{i}"),
        range(5)
    ))
print(f"Threading: {time.time() - start:.2f}s")  # ~1 сек

# 3. Asyncio - лучший выбор для I/O (современный подход)
import aiohttp
import asyncio

async def fetch(session, url):
    async with session.get(url) as resp:
        return await resp.json()

async def main():
    async with aiohttp.ClientSession() as session:
        tasks = [
            fetch(session, f"https://jsonplaceholder.typicode.com/posts/{i}")
            for i in range(5)
        ]
        await asyncio.gather(*tasks)

start = time.time()
asyncio.run(main())
print(f"Asyncio: {time.time() - start:.2f}s")  # ~1 сек, более эффективно

Таблица подходов для сетевых задач

ПодходСкоростьСложностьМасштабируемость
Sequential❌ Медленно✅ Простой❌ Плохая
Threading✅ Хорошо✅ Средняя⚠️ До ~1000 потоков
Asyncio✅ Хорошо❌ Сложнее✅ Отличная (1000+)
Multiprocessing⚠️❌ Сложно✅ Но не для I/O

Вывод

Сетевые запросы - это I/O-bound задачи, и для них:**

  • asyncio - лучший современный выбор
  • threading - простая альтернатива
  • sequential - избегать в production

При масштабировании предпочитай asyncio для больших объемов параллельных I/O операций.