Recollir cada resultat de peticions proxy urllib3 concurrents
Compartiu un ProxyManager configurat entre fils de treball, consumiu l'iterador de resultats de l'executor i distingiu la retenció del pool d'un límit de connexions.
Crear un pool de treballadors no lliura al cridador les pàgines descarregades. Conserveu i consumiu els valors que retorna el treball enviat:
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()Aquest fragment assumeix una llista limitada d'URL i mides de resposta ordinàries. Per a comprovacions d'URL públiques permeses sense autenticació de proxy, un candidat de la llista de proxies HTTP pot substituir l'extrem HTTP d'exemple del gestor. Cada resultat inclou la seva URL perquè el cridador pugui associar l'estat i el cos amb la petició correcta. map retorna els resultats en l'ordre d'entrada; una excepció en un treballador es llança quan es recupera aquell resultat.
El ProxyManager configurat posseeix l'agrupació de connexions per a les peticions. Amb el mode de resposta precarregada per defecte usat aquí, urllib3 llegeix el cos i retorna la connexió al seu pool. Una versió en streaming necessitaria un consum explícit i l'alliberament de la connexió.
maxsize normalment controla les connexions reutilitzables retingudes, no un límit dur a cada socket obert. block=True canvia el comportament rellevant del pool perquè els cridadors esperin una connexió lliure en lloc d'obrir-ne d'addicionals per sobre del límit d'aquell pool.
El nombre de treballadors limita les crides concurrents en aquest exemple. Amb moltes destinacions, també importen la disposició del pool i la ruta usada per als túnels HTTPS; un paràmetre per pool no s'ha de descriure com una quota global de sockets per a cada amfitrió.