timeout=5 в requests — не то, что кажется: connect, read, ретраи и бюджет времени

nikita-practice 43 минуты назад Краткое содержание статьи timeout=5 в requests — не то, что кажется: connect, read, ретраи и бюджет времени 6 мин 1.4K Python * Программирование * Веб-разработка * Типичная история:...
<5 — 2026'da uzaya kaç SpaceX Starship fırlatması ulaşacak?
Вот важная новость с фронта ИИ: nikita-practice 43 минуты назад Краткое содержание статьи timeout=5 в requests — не то, что кажется: connect, read, ретраи и бюджет времени 6 мин 1. 4K Python * Программирование * Веб-разработка * Типичная история: ночной скрипт ходит во внешний API, «вроде с таймаутом», а утром в логах дыра на два часа и один воркер, который так и не умер. В коде при этом стоит timeout=5.
Ниже — разбор того, что на самом деле означает таймаут в requests / urllib3, чем connect отличается от read, когда ретраи помогают, а когда устраивают шторм, и простой паттерн «бюджет времени», который я прогнал на локальном сервере. Версии на стенде: Python 3. Числа в статье — с этого прогона, не из головы.
Технические детали
Главный сюрприз: по умолчанию таймаута нетЕсли вызвать requests. get(url) без аргумента timeout, клиент будет ждать ответа столько, сколько живёт сокет. В документации requests это сказано прямо: значение по умолчанию — None, то есть «ждать вечно».
На практике это выглядит так: DNS и TCP прошли, сервер принял соединение и завис при формировании ответа — ваш процесс тоже завис. Никакого исключения через 5, 30 или 300 секунд не будет. Именно поэтому «у нас же requests, он же сам» — опасная иллюзия.
Минимум, который стоит писать всегда:import requests r = requests. get(url, timeout=5) # url — адрес вашего API Уже лучше. Но и здесь есть нюанс.
Отраслевые последствия
Одно число — это два таймаута сразуВ requests аргумент timeout может быть:одним числом — тогда и connect, и read ограничены этим значением;кортежем (connect_timeout, read_timeout). Connect — сколько ждать установления TCP-соединения (и TLS, если он есть). Read — сколько ждать между чтениями из сокета после того, как соединение уже есть.
Это не «общая длительность запроса». Чтобы увидеть разницу, поднимем крошечный сервер: /slow отвечает через 2 секунды, /hang молчит минуту. py (фрагмент) elif self.
startswith("/slow : time. _reply(200, b"slow-ok elif self. startswith("/hang : time.
Событие, по словам экспертов, усилит конкуренцию в сфере ИИ.






