Darbuotojų baseino sukūrimas neperduoda kviečiančiajam atsisiųstų puslapių. Išsaugokite ir naudokite reikšmes, kurias grąžina pateiktas darbas:

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()

Šis fragmentas daro prielaidą, kad URL sąrašas yra ribotas, o atsakymų dydžiai įprasti. Leidžiamiems viešų URL patikrinimams be proxy autentifikavimo kandidatas iš HTTP proxy sąrašo gali pakeisti valdytojo pavyzdinį HTTP galinį tašką. Kiekvienas rezultatas turi savo URL, kad kviečiantysis galėtų susieti būseną ir turinį su teisinga užklausa. map grąžina rezultatus įvesties tvarka; išimtis darbuotojuje iškeliama, kai tas rezultatas gaunamas.

Sukonfigūruotas ProxyManager valdo užklausų ryšių baseiną. Naudojant čia nurodytą numatytąjį iš anksto įkeltų atsakymų režimą, urllib3 nuskaito turinį ir grąžina ryšį į savo baseiną. Srautinė versija reikalautų aiškaus sunaudojimo ir ryšio atlaisvinimo.

maxsize paprastai kontroliuoja išlaikomus daugkartinio naudojimo ryšius, o ne griežtą kiekvieno atidaryto lizdo ribą. block=True pakeičia atitinkamą baseino elgesį, kad kviečiantieji lauktų laisvo ryšio, o ne atidarytų papildomų, viršijančių to baseino limitą.

Darbuotojų skaičius šiame pavyzdyje riboja lygiagrečius kvietimus. Esant daug paskirties vietų, taip pat svarbu baseino išdėstymas ir maršrutas, naudojamas HTTPS tuneliams; vieno baseino nustatymas neturėtų būti aprašomas kaip vieninė pasaulinė lizdų kvota kiekvienam hostui.

Susiję straipsniai