A HTTPX PoolTimeout nem proxykapcsolati időtúllépés
Ismerd fel a HTTPX kapcsolatkészletében várakozást, és szabadítsd fel a streamelt válaszokat, mielőtt lecseréled a talán új kérést sem kapó proxyt.
A PoolTimeout azt jelenti, hogy a HTTPX nem kapott kapcsolatot a készletből a beállított várakozási időn belül. Nem bizonyítja, hogy egy új TCP-kapcsolat a proxyhoz időtúllépést szenvedett. A második kérés még a folyamatodon belül várhat.
Könnyen előidézhető, ha a kliens egy kapcsolatot enged, és az első streamelt válasz nyitva marad. Egy másik kérés indítása nem szabadítja fel varázsütésre azt a kapcsolatot.
Legyen látható a streamelt válasz felelőse
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)
Futtatás előtt cseréld le a dokumentációs proxycímet. A következő kérés a stream kontextusának elhagyása után indul. Ez a kilépés akkor is lezárja a választ, ha a kód megszakítja a ciklust vagy kivételt dob.
Kézi streamelésnél, például client.send(request, stream=True) esetén, a te kódod felel a végső lezárásért. AsyncClientnél a megfelelő kézi takarítást a response.aclose() hívással kell megvárni. Egy olvasatlan válasz lezárása felszabadít kapacitást, de szükségessé teheti az alatta lévő kapcsolat eldobását az újrahasználat helyett.
Olvasd el a kivétel nevét
A ConnectTimeout a kapcsolat létesítéséről szól. A ReadTimeout a válaszadatok várásáról. A PoolTimeout egy kapcsolathely megszerzéséről. Ha csak «proxyidőtúllépés» kerül a naplóba, elvész a javítás kiválasztásához szükséges különbség.
Végpont-IP-k cseréje előtt ellenőrizd a nyitott válaszokat, a párhuzamos feladatokat és a kapcsolati limiteket. Nagyobb készlet indokolt lehet valós párhuzamos terheléshez, de nem javítja meg a soha le nem zárt válaszokat. Csak több elfoglalható kapacitást ad az alkalmazásnak.
Tartsd meg újrahasználhatónak a klienst a teljes munkaterhelés alatt. A kliens újraépítése, hogy minden kérés működőnek látsszon, elfedhet egy életciklusproblémát és elveszítheti a kapcsolat-újrahasználatot.