Om 'n werkerpoel te skep gee nie die opgeroepte blaaie aan die oproeper nie. Hou en verbruik die waardes wat deur die ingediende werk teruggegee word:

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

Hierdie fragment aanvaar 'n beperkte lys URL's en gewone respongroottes. Vir toegelate publieke-URL-toetse sonder proxy-verifikasie kan 'n kandidaat uit die HTTP-proxylys die bestuurder se voorbeeld-HTTP-eindpunt vervang. Elke resultaat sluit sy URL in sodat die oproeper status en liggaam aan die korrekte versoek kan koppel. map gee resultate in invoervolgorde terug; 'n uitsondering in 'n werker word opgewek wanneer daardie resultaat opgehaal word.

Die gekonfigureerde ProxyManager besit verbindingspoeling vir die versoeke. Met die verstek voorafgelaaide responmodus wat hier gebruik word, lees urllib3 die liggaam en gee die verbinding aan sy poel terug. 'n Stroomvariant sou eksplisiete verbruik en vrystelling van die verbinding vereis.

maxsize beheer gewoonlik behoue herbruikbare verbindings, nie 'n harde perk op elke oopgemaakte sok nie. block=True verander die betrokke poelgedrag sodat oproepers op 'n vrye verbinding wag eerder as om addisionele te open bo daardie poel se limiet.

Die werkertal begrens gelyktydige oproepe in hierdie voorbeeld. Met baie bestemmings maak poeluitleg en die roete vir HTTPS-tonnels ook saak; 'n instelling per poel moet nie as een globale sokkwota vir elke gasheer beskryf word nie.

Verwante artikels