PoolTimeout betyder, at HTTPX ikke kunne få en forbindelse fra puljen inden for den indstillede ventetid. Det beviser ikke en timeout på en ny TCP-forbindelse til proxyen. Den anden anmodning kan stadig vente inde i din proces.

Det er let at genskabe, når klienten tillader én forbindelse, og det første streaming-svar efterlades åbent. En ny anmodning frigiver ikke forbindelsen af sig selv.

Gør ansvaret for streaming-svar tydeligt

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)

Udskift dokumentationens proxyadresse før kørsel. Den næste anmodning begynder, efter at stream-konteksten er afsluttet. Det lukker svaret, selv hvis koden forlader løkken eller kaster en undtagelse.

Ved manuel streaming som client.send(request, stream=True) har din kode ansvaret for den endelige lukning. For AsyncClient afventes den tilsvarende manuelle oprydning med response.aclose(). Lukning af et ulæst svar frigiver kapacitet, men kan kræve, at den underliggende forbindelse kasseres i stedet for at blive genbrugt.

Læs undtagelsens navn

ConnectTimeout handler om etablering af forbindelse. ReadTimeout handler om at vente på svardata. PoolTimeout handler om at få en forbindelsesplads. Logger du kun «proxytimeout», mister du den forskel, der er nødvendig for at vælge en løsning.

Kontroller åbne svar, samtidige opgaver og forbindelsesgrænser, før du skifter endepunkternes IP-adresser. En større pulje kan passe til legitim samtidig belastning, men retter ikke svar, der aldrig lukkes. Den giver blot programmet mere kapacitet at optage.

Behold klienten, så den kan genbruges på tværs af arbejdsbelastningen. At oprette klienten på ny for at få hver anmodning til at se ud til at virke kan skjule et livscyklusproblem og opgive forbindelsesgenbrug.

Relaterede artikler