HTTPX PoolTimeout није истек времена везе са проксијем
Препознајте чекање у HTTPX скупу веза и ослободите стриминг одговоре пре замене проксија који можда није ни добио нови захтев.
PoolTimeout значи да HTTPX није добио везу из скупа унутар подешеног времена чекања. То није доказ истека времена нове TCP везе са проксијем. Други захтев можда још чека унутар вашег процеса.
То је лако поновити када клијент дозвољава једну везу, а први стриминг одговор остане отворен. Покретање другог захтева не ослобађа ту везу само од себе.
Јасно покажите одговорност за стриминг одговор
import httpx
limits = httpx.Limits(
max_connections=1,
max_keepalive_connections=1,
)
timeout = httpx.Timeout(
connect=5, read=10, write=10, pool=1
)
with httpx.Client(
proxy="http://203.0.113.10:8080",
trust_env=False,
limits=limits,
timeout=timeout,
) as client:
with client.stream("GET", "https://example.com/") as response:
print(response.status_code)
for chunk in response.iter_bytes():
print(len(chunk))
next_response = client.get("https://example.com/")
print(next_response.status_code)
Замените документациону адресу проксија пре покретања. Следећи захтев почиње после изласка из стриминг контекста. Излазак затвара одговор чак и ако код прекине петљу или баци изузетак.
Код ручног стриминга, као што је client.send(request, stream=True), ваш код одговара за коначно затварање. За AsyncClient одговарајуће ручно чишћење чека се позивом response.aclose(). Затварање непрочитаног одговора ослобађа капацитет, али може да захтева одбацивање основне везе уместо поновне употребе.
Прочитајте назив изузетка
ConnectTimeout односи се на успостављање везе. ReadTimeout односи се на чекање података одговора. PoolTimeout односи се на добијање места за везу. Записивање само «proxy timeout» губи разлику потребну за избор исправке.
Пре промене IP-ова крајњих тачака проверите отворене одговоре, конкурентне задатке и ограничења веза. Већи скуп може да одговара оправданом истовременом оптерећењу, али не поправља одговоре који се никада не затварају. Само даје апликацији више капацитета за заузимање.
Задржите клијент за поновну употребу кроз цело оптерећење. Поновно прављење клијента да би сваки захтев изгледао успешан може да сакрије проблем животног циклуса и изгуби поновну употребу веза.