Короткий ответ
Keep-alive позволяет повторно использовать одно и то же TCP-соединение для нескольких HTTP-запросов подряд, избегая накладных расходов на установку нового соединения (и TLS-хендшейка) для каждого запроса.
Как это работает подробнее
в HTTP/1.1 keep-alive включён по умолчанию (в отличие от HTTP/1.0), соединение остаётся открытым после ответа, пока клиент или сервер не закроют его явно (заголовком Connection: close) или по таймауту неактивности.
Пример кода
example.py
import requests
# Неэффективно: новое соединение на каждый вызов
def fetch_bad(url):
return requests.get(url).json()
# Эффективно: одно переиспользуемое соединение (keep-alive) для серии запросов
session = requests.Session()
def fetch_good(url):
return session.get(url).json()
for i in range(100):
fetch_good(f"https://api.example.com/items/{i}")Что использовать на практике
- Рекомендация. при множестве вызовов к одному и тому же внешнему сервису стоит использовать переиспользуемую сессию клиента (например,
requests.Session()или пул соединений вhttpx/aiohttp), а не создавать новое соединение на каждый запрос — это заметно снижает латентность при частых вызовах.
Подводные камни
- Риски. создавать новый
requests.Session()или новое TCP-соединение на каждый вызов функции, обрабатывающей запрос, что увеличивает нагрузку и задержку при частых обращениях к внешнему API; не закрывать сессии/пулы соединений, что может приводить к утечке файловых дескрипторов при долгой работе процесса.