HTTPX PoolTimeout nie je timeout pripojenia k proxy
Rozpoznajte čakanie vo fonde HTTPX a uvoľňujte streamované odpovede skôr, než vymeníte proxy, ktorá možno vôbec nedostala ďalšiu požiadavku.
PoolTimeout znamená, že HTTPX nezískal spojenie z fondu počas nastaveného času čakania. Nie je to dôkaz timeoutu nového TCP spojenia k proxy. Druhá požiadavka môže stále čakať vnútri vášho procesu.
Ľahko sa to reprodukuje, keď klient povoľuje jedno spojenie a prvá streamovaná odpoveď zostane otvorená. Spustenie ďalšej požiadavky toto spojenie samo neuvoľní.
Zviditeľnite zodpovednosť za streamovanú odpoveď
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)
Pred spustením nahraďte dokumentačnú adresu proxy. Ďalšia požiadavka sa začne po opustení kontextu streamu. Tento odchod zavrie odpoveď, aj keď kód opustí slučku alebo vyvolá výnimku.
Pri ručnom streamovaní, napríklad client.send(request, stream=True), zodpovedá váš kód za konečné zatvorenie. Pri AsyncClient sa na zodpovedajúce ručné čistenie čaká pomocou response.aclose(). Zatvorenie neprečítanej odpovede uvoľní kapacitu, ale môže vyžadovať zahodenie podkladového spojenia namiesto jeho opätovného použitia.
Čítajte názov výnimky
ConnectTimeout sa týka nadväzovania spojenia. ReadTimeout sa týka čakania na dáta odpovede. PoolTimeout sa týka získania miesta pre spojenie. Zápis samotného «timeout proxy» stráca rozlíšenie potrebné na voľbu nápravy.
Pred výmenou IP koncových bodov skontrolujte otvorené odpovede, súbežné úlohy a limity spojení. Väčší fond môže byť vhodný pre oprávnenú súbežnú záťaž, ale neopraví odpovede, ktoré sa nikdy nezatvárajú. Len dáva aplikácii viac kapacity na obsadenie.
Udržujte klienta opakovane použiteľným v rámci celej záťaže. Vytváranie nového klienta, aby každá požiadavka zdanlivo fungovala, môže skryť problém životného cyklu a zahodiť opätovné využitie spojení.