Samle hvert resultat fra samtidige urllib3-proxyforespørsler
Del en konfigurert ProxyManager mellom arbeidstråder, bruk utførerens resultatiterator og skill beholdning i puljen fra en tilkoblingsgrense.
Å opprette en arbeiderpool gir ikke innringeren de nedlastede sidene. Behold og bruk verdiene som det innsendte arbeidet returnerer:
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()Denne utdragene forutsetter en avgrenset liste med URL-er og vanlige svarstørrelser. For tillatte offentlige URL-kontroller uten proxyautentisering kan en kandidat fra HTTP-proxylisten erstatte lederens eksempel-HTTP-endepunkt. Hvert resultat inneholder URL-en sin slik at innringeren kan knytte status og brødtekst til riktig forespørsel. map returnerer resultater i inndataordre; et unntak i en arbeider utløses når det resultatet hentes.
Den konfigurerte ProxyManager eier tilkoblingspoolen for forespørslene. Med standard forhåndslastet svarmodus som brukes her, leser urllib3 brødteksten og returnerer tilkoblingen til poolen sin. En strømmende versjon ville trenge eksplisitt forbruk og frigjøring av tilkoblingen.
maxsize styrer vanligvis beholdte gjenbrukbare tilkoblinger, ikke en hard grense for hver åpnet socket. block=True endrer den relevante pooladferden slik at innringere venter på en ledig tilkobling i stedet for å åpne flere utover den poolens grense.
Antallet arbeidere begrenser samtidige kall i dette eksempelet. Med mange destinasjoner betyr også puljeoppsettet og ruten som brukes for HTTPS-tunneler noe; en innstilling per pool bør ikke beskrives som en global socketkvote for hver vert.