PoolTimeout znači da HTTPX nije dobio vezu iz bazena unutar postavljenog vremena čekanja. To nije dokaz isteka vremena nove TCP veze s proxyjem. Drugi zahtjev možda još čeka unutar vašeg procesa.

To je lako ponoviti kada klijent dopušta jednu vezu, a prvi strujni odgovor ostane otvoren. Pokretanje drugog zahtjeva ne oslobađa tu vezu samo od sebe.

Jasno pokažite odgovornost za strujni 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)

Zamijenite dokumentacijsku adresu proxyja prije pokretanja. Sljedeći zahtjev počinje nakon izlaska iz konteksta strujanja. Izlazak zatvara odgovor čak i ako kod prekine petlju ili baci iznimku.

Kod ručnog strujanja, kao što je client.send(request, stream=True), vaš kod odgovara za konačno zatvaranje. Za AsyncClient odgovarajuće ručno čišćenje čeka se pozivom response.aclose(). Zatvaranje nepročitanog odgovora oslobađa kapacitet, ali može zahtijevati odbacivanje temeljne veze umjesto ponovne uporabe.

Pročitajte naziv iznimke

ConnectTimeout odnosi se na uspostavu veze. ReadTimeout odnosi se na čekanje podataka odgovora. PoolTimeout odnosi se na dobivanje mjesta za vezu. Zapisivanje samo «proxy timeout» gubi razliku potrebnu za odabir popravka.

Prije promjene IP-jeva krajnjih točaka provjerite otvorene odgovore, istodobne zadatke i granice veza. Veći bazen može odgovarati opravdanom istodobnom opterećenju, ali ne popravlja odgovore koji se nikad ne zatvaraju. Samo daje aplikaciji više kapaciteta za zauzimanje.

Zadržite klijent za ponovnu uporabu kroz cijelo opterećenje. Ponovno stvaranje klijenta kako bi svaki zahtjev izgledao uspješan može sakriti problem životnog ciklusa i izgubiti ponovnu uporabu veza.

Povezani članci