← Назад к вопросам
Каким классом задач является запрос по сети?
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 | вычисления, обработка данных | CPU | multiprocessing, 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 операций.