HTTPX PoolTimeout ni časovna omejitev povezave s posrednikom
Prepoznajte čakanje v zbirki povezav HTTPX in sprostite pretočne odgovore, preden zamenjate posrednik, ki morda ni prejel nove zahteve.
PoolTimeout pomeni, da HTTPX v nastavljenem času čakanja ni dobil povezave iz zbirke. To ni dokaz časovne omejitve nove povezave TCP s posrednikom. Druga zahteva lahko še čaka znotraj vašega procesa.
To je preprosto ponoviti, ko odjemalec dovoli eno povezavo, prvi pretočni odgovor pa ostane odprt. Zagon nove zahteve te povezave ne sprosti sam od sebe.
Jasno pokažite odgovornost za pretočni odgovor
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 izvajanjem zamenjajte dokumentacijski naslov posrednika. Naslednja zahteva se začne po izhodu iz pretočnega konteksta. Izhod zapre odgovor tudi, če koda prekine zanko ali sproži izjemo.
Pri ročnem pretakanju, na primer client.send(request, stream=True), je vaša koda odgovorna za končno zaprtje. Pri AsyncClient na ustrezno ročno čiščenje počakate z response.aclose(). Zaprtje neprebranega odgovora sprosti kapaciteto, vendar lahko zahteva zavrženje osnovne povezave namesto ponovne uporabe.
Preberite ime izjeme
ConnectTimeout zadeva vzpostavljanje povezave. ReadTimeout zadeva čakanje na podatke odgovora. PoolTimeout zadeva pridobivanje mesta za povezavo. Zapis samo «časovna omejitev posrednika» izgubi razliko, potrebno za izbiro popravka.
Pred zamenjavo IP-jev končnih točk preverite odprte odgovore, sočasne naloge in omejitve povezav. Večja zbirka je lahko ustrezna za upravičeno sočasno obremenitev, ne popravi pa odgovorov, ki se nikoli ne zaprejo. Aplikaciji le da več kapacitete za zasedbo.
Ohranite odjemalca za ponovno uporabo skozi celotno obremenitev. Ustvarjanje novega odjemalca, da bi vsaka zahteva navidez delovala, lahko skrije težavo življenjskega cikla in zavrže ponovno uporabo povezav.