Krijimi i një pishine punëtorësh nuk i jep thirrësit faqet e shkarkuara. Ruani dhe konsumoni vlerat që kthen puna e dorëzuar:

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

Ky fragment supozon një listë të kufizuar URL-ash dhe madhësi të zakonshme përgjigjesh. Për kontrolle të lejuara të URL-ve publike pa vërtetim përfaqësuesi, një kandidat nga lista e përfaqësuesve HTTP mund të zëvendësojë pikën përfundimtare HTTP shembull të menaxherit. Çdo rezultat përfshin URL-në e tij, kështu që thirrësi mund ta lidhë statusin dhe trupin me kërkesën e saktë. map kthen rezultatet sipas rendit të hyrjes; një përjashtim në një punëtor ngrihet kur merret ai rezultat.

ProxyManager i konfiguruar zotëron grumbullimin e lidhjeve për kërkesat. Me modalitetin e parazgjedhur të përgjigjes së parangarkuar që përdoret këtu, urllib3 lexon trupin dhe e kthen lidhjen në pishinën e tij. Një version transmetimi do të kërkonte konsum eksplicit dhe lirim të lidhjes.

maxsize normalisht kontrollon lidhjet e ripërdorshme të mbajtura, jo një kufi të fortë për çdo socket të hapur. block=True ndryshon sjelljen përkatëse të pishinës, kështu që thirrësit presin një lidhje të lirë në vend që të hapin të tjera shtesë përtej kufirit të asaj pishine.

Numri i punëtorëve kufizon thirrjet e njëkohshme në këtë shembull. Me shumë destinacione, kanë rëndësi edhe plani i pishinës dhe rruga e përdorur për tunelet HTTPS; një cilësim për pishinë nuk duhet të përshkruhet si një kuotë globale socketsh për çdo host.

Artikuj të ngjashëm