HTTPX PoolTimeout nav savienojuma ar starpniekserveri noildze
Atpazīstiet gaidīšanu HTTPX savienojumu pūlā un atbrīvojiet straumētas atbildes, pirms nomaināt starpniekserveri, kas varbūt pat nesaņēma nākamo pieprasījumu.
PoolTimeout nozīmē, ka HTTPX nesaņēma savienojumu no pūla iestatītajā gaidīšanas laikā. Tas nepierāda jauna TCP savienojuma ar starpniekserveri noildzi. Otrais pieprasījums var vēl gaidīt jūsu procesa iekšienē.
To ir viegli atkārtot, ja klients atļauj vienu savienojumu un pirmā straumētā atbilde paliek atvērta. Cita pieprasījuma sākšana šo savienojumu pati neatbrīvo.
Padariet atbildību par straumēto atbildi skaidru
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)
Pirms izpildes aizstājiet dokumentācijas starpniekservera adresi. Nākamais pieprasījums sākas pēc iziešanas no straumes konteksta. Iziešana aizver atbildi arī tad, ja kods iziet no cikla vai izmet izņēmumu.
Manuālai straumēšanai, piemēram, client.send(request, stream=True), jūsu kods atbild par galīgo aizvēršanu. AsyncClient gadījumā atbilstošo manuālo tīrīšanu gaida ar response.aclose(). Nelasītas atbildes aizvēršana atbrīvo ietilpību, bet var prasīt pamata savienojuma atmešanu, nevis atkārtotu izmantošanu.
Lasiet izņēmuma nosaukumu
ConnectTimeout attiecas uz savienojuma izveidi. ReadTimeout attiecas uz atbildes datu gaidīšanu. PoolTimeout attiecas uz savienojuma vietas iegūšanu. Žurnālā rakstot tikai «starpniekservera noildze», pazūd atšķirība, kas vajadzīga pareiza labojuma izvēlei.
Pirms galapunktu IP maiņas pārbaudiet atvērtās atbildes, vienlaicīgos uzdevumus un savienojumu robežas. Lielāks pūls var būt piemērots pamatotai vienlaicīgai slodzei, bet neizlabo atbildes, kas nekad netiek aizvērtas. Tas tikai dod lietotnei vairāk aizņemamas ietilpības.
Saglabājiet klientu atkārtoti izmantojamu visai slodzei. Tā atkārtota izveide, lai katrs pieprasījums šķistu darbojamies, var slēpt dzīves cikla problēmu un zaudēt savienojumu atkārtotu izmantošanu.