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

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

Jasno pokažite odgovornost za streaming 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 proksija prije pokretanja. Sljedeći zahtjev počinje poslije izlaska iz streaming konteksta. Izlazak zatvara odgovor čak i ako kod prekine petlju ili baci izuzetak.

Kod ručnog streaminga, 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 osnovne veze umjesto ponovne upotrebe.

Pročitajte naziv izuzetka

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

Prije promjene IP-jeva krajnjih tačaka provjerite otvorene odgovore, konkurentne zadatke i ograničenja veza. Veći skup može odgovarati opravdanom istovremenom opterećenju, ali ne popravlja odgovore koji se nikada ne zatvaraju. Samo daje aplikaciji više kapaciteta za zauzimanje.

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

Povezani članci