Հավաքել յուրաքանչյուր արդյունք զուգահեռ urllib3 պրոքսի հարցումներից
Կիսվեք կարգավորված ProxyManager-ով աշխատանքային թելերի միջև, սպառեք կատարողի արդյունքների իտերատորը և տարբերեք լողավազանի պահպանումը միացման սահմանից։
Աշխատողների լողավազան ստեղծելը չի տալիս կանչողին ներբեռնված էջերը։ Պահեք և սպառեք ուղարկված աշխատանքի վերադարձրած արժեքները՝
from concurrent.futures import ThreadPoolExecutor
import urllib3
manager = urllib3.ProxyManager(
'http://proxy.example:8080',
maxsize=4,
block=True,
)
def fetch(url):
response = manager.request(
'GET', url, timeout=urllib3.Timeout(connect=5, read=15),
)
return url, response.status, response.data
try:
with ThreadPoolExecutor(max_workers=4) as workers:
results = list(workers.map(fetch, urls))
finally:
manager.clear()Այս հատվածը ենթադրում է URL-ների սահմանափակ ցանկ և սովորական պատասխանների չափեր։ Առանց պրոքսի նույնականացման թույլատրված հանրային URL ստուգումների համար HTTP պրոքսիների ցանկից թեկնածուն կարող է փոխարինել կառավարչի օրինակելի HTTP վերջնակետը։ Յուրաքանչյուր արդյունք ներառում է իր URL-ը, որպեսզի կանչողը կարողանա կարգավիճակն ու մարմինը կապել ճիշտ հարցման հետ։ map-ը արդյունքները վերադարձնում է մուտքային հերթականությամբ. աշխատողի մեջ բացառությունը բարձրացվում է, երբ այդ արդյունքը ստացվում է։
Կարգավորված ProxyManager-ը տիրապետում է հարցումների միացումների լողավազանին։ Այստեղ օգտագործվող նախապես բեռնված պատասխանի լռելյայն ռեժիմով urllib3-ը կարդում է մարմինը և վերադարձնում միացումը իր լողավազան։ Հոսքային տարբերակը կպահանջի բացահայտ սպառում և միացման ազատում։
maxsize-ը սովորաբար կառավարում է պահպանվող կրկին օգտագործելի միացումները, ոչ թե յուրաքանչյուր բացված socket-ի կոշտ սահման։ block=True-ը փոխում է համապատասխան լողավազանի վարքը, որպեսզի կանչողները սպասեն ազատ միացման, փոխարենը այդ լողավազանի սահմանից ավելի լրացուցիչներ բացելու։
Աշխատողների քանակը այս օրինակում սահմանափակում է միաժամանակյա կանչերը։ Շատ նպատակակետերի դեպքում կարևոր են նաև լողավազանի դասավորությունը և HTTPS թունելների համար օգտագործվող ուղին. մեկ լողավազանի կարգավորումը չպետք է նկարագրվի որպես մեկ գլոբալ socket քվոտա յուրաքանչյուր հոսթի համար։