PoolTimeout tarkoittaa, ettei HTTPX saanut yhteyttä poolista asetetun odotusajan kuluessa. Se ei todista uuden TCP-yhteyden välityspalvelimeen aikakatkaisua. Toinen pyyntö saattaa vielä odottaa prosessisi sisällä.

Tämä on helppo toistaa, kun asiakas sallii yhden yhteyden ja ensimmäinen suoratoistovastaus jätetään auki. Uuden pyynnön aloittaminen ei vapauta yhteyttä itsestään.

Tee suoratoistovastauksen omistajuus selväksi

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)

Korvaa dokumentaation välityspalvelinosoite ennen ajamista. Seuraava pyyntö alkaa vasta suoratoistokontekstista poistumisen jälkeen. Poistuminen sulkee vastauksen, vaikka koodi poistuisi silmukasta tai nostaisi poikkeuksen.

Manuaalisessa suoratoistossa, kuten client.send(request, stream=True), koodisi vastaa lopullisesta sulkemisesta. AsyncClientin vastaavaa manuaalista siivousta odotetaan kutsulla response.aclose(). Lukemattoman vastauksen sulkeminen vapauttaa kapasiteettia, mutta voi edellyttää alla olevan yhteyden hylkäämistä uudelleenkäytön sijaan.

Lue poikkeuksen nimi

ConnectTimeout koskee yhteyden muodostamista. ReadTimeout koskee vastausdatan odottamista. PoolTimeout koskee yhteyspaikan saamista. Pelkkä lokimerkintä «välityspalvelimen aikakatkaisu» hukkaa oikean korjauksen valitsemiseen tarvittavan eron.

Tarkista avoimet vastaukset, rinnakkaiset tehtävät ja yhteysrajat ennen päätepisteiden IP-osoitteiden vaihtamista. Suurempi pooli voi sopia todelliseen rinnakkaiseen kuormaan, mutta se ei korjaa vastauksia, joita ei koskaan suljeta. Se vain antaa sovellukselle enemmän varattavaa kapasiteettia.

Säilytä asiakas uudelleenkäytettävänä koko kuorman ajan. Asiakkaan luominen uudelleen, jotta jokainen pyyntö näyttäisi toimivan, voi piilottaa elinkaariongelman ja hukata yhteyksien uudelleenkäytön.

Aiheeseen liittyvät artikkelit