HTTPX PoolTimeout er ikke en tilkoblingstimeout til proxyen
Gjenkjenn venting i HTTPX-forbindelsespoolen, og frigjør strømmende svar før du bytter ut en proxy som kanskje aldri mottok neste forespørsel.
PoolTimeout betyr at HTTPX ikke kunne få en forbindelse fra poolen innen den konfigurerte ventetiden. Det beviser ikke at en ny TCP-forbindelse til proxyen fikk tidsavbrudd. Den andre forespørselen kan fortsatt vente inne i prosessen.
Dette er lett å gjenskape når klienten tillater én forbindelse, og det første strømmende svaret blir stående åpent. Å starte en ny forespørsel frigjør ikke den forbindelsen av seg selv.
Gjør ansvaret for strømmende svar synlig
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)
Bytt ut dokumentasjonsadressen til proxyen før kjøring. Neste forespørsel starter etter at strømmekonteksten er avsluttet. Det lukker svaret også om koden bryter ut av løkken eller kaster et unntak.
Ved manuell strømming, som client.send(request, stream=True), er koden din ansvarlig for den endelige lukkingen. For AsyncClient avventes den tilsvarende manuelle oppryddingen med response.aclose(). Å lukke et ulest svar frigjør kapasitet, men kan kreve at den underliggende forbindelsen forkastes i stedet for å bli brukt om igjen.
Les navnet på unntaket
ConnectTimeout gjelder etablering av forbindelse. ReadTimeout gjelder venting på svardata. PoolTimeout gjelder å få en forbindelsesplass. Å bare logge «proxytimeout» mister skillet som trengs for å velge en løsning.
Kontroller åpne svar, samtidige oppgaver og forbindelsesgrenser før du bytter endepunkt-IP-er. En større pool kan passe til legitim samtidig belastning, men retter ikke svar som aldri blir lukket. Den gir bare programmet mer kapasitet å oppta.
Behold klienten slik at den kan brukes om igjen gjennom arbeidsbelastningen. Å opprette en ny klient for at hver forespørsel skal se ut til å virke kan skjule et livssyklusproblem og fjerne gjenbruk av forbindelser.