HTTPX PoolTimeout-ը պրոքսիին միանալու ժամանակի սպառում չէ
Տարբերեք HTTPX կապերի ավազանում սպասումը և ազատեք հոսքային պատասխանները, նախքան փոխեք պրոքսին, որը գուցե նոր հարցում չի էլ ստացել։
PoolTimeout-ը նշանակում է, որ HTTPX-ը կարգավորված սպասման ժամանակում չի ստացել կապ իր ավազանից։ Դա պրոքսիին նոր TCP կապի ժամանակի սպառման ապացույց չէ։ Երկրորդ հարցումը գուցե դեռ սպասում է ձեր գործընթացի ներսում։
Սա հեշտ է կրկնել, երբ հաճախորդը թույլ է տալիս մեկ կապ, իսկ առաջին հոսքային պատասխանը մնում է բաց։ Նոր հարցում սկսելը այդ կապը ինքնաբերաբար չի ազատում։
Հստակ ցույց տվեք հոսքային պատասխանի պատասխանատուին
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)
Գործարկումից առաջ փոխարինեք փաստաթղթային պրոքսի հասցեն։ Հաջորդ հարցումը սկսվում է հոսքի համատեքստից դուրս գալուց հետո։ Դուրս գալը փակում է պատասխանը, նույնիսկ եթե կոդը ընդհատում է ցիկլը կամ բացառություն է առաջացնում։
Ձեռքով հոսքային ռեժիմում, օրինակ՝ client.send(request, stream=True), վերջնական փակման համար պատասխանատու է ձեր կոդը։ AsyncClient-ի համապատասխան ձեռքով մաքրումը սպասվում է response.aclose()-ով։ Չկարդացված պատասխանը փակելը ազատում է տարողություն, բայց կարող է պահանջել հիմքում ընկած կապը դեն նետել՝ կրկին օգտագործելու փոխարեն։
Կարդացեք բացառության անունը
ConnectTimeout-ը վերաբերում է կապի հաստատմանը։ ReadTimeout-ը՝ պատասխանի տվյալներին սպասելուն։ PoolTimeout-ը՝ կապի տեղ ստանալուն։ Միայն «պրոքսիի timeout» գրանցելը կորցնում է ճիշտ լուծում ընտրելու համար անհրաժեշտ տարբերությունը։
Նախքան միացման կետերի IP-ները փոխելը ստուգեք բաց պատասխանները, զուգահեռ առաջադրանքներն ու կապերի սահմանները։ Մեծ ավազանը կարող է հարմար լինել հիմնավոր զուգահեռ բեռի համար, բայց չի ուղղում երբեք չփակվող պատասխանները։ Այն պարզապես ծրագրին ավելի շատ զբաղեցնելի տարողություն է տալիս։
Հաճախորդը պահեք կրկնակի օգտագործման համար ամբողջ բեռի ընթացքում։ Ամեն հարցում աշխատող թվալու համար հաճախորդը վերաստեղծելը կարող է թաքցնել կյանքի ցիկլի խնդիրը և կորցնել կապերի կրկնակի օգտագործումը։