Colectarea fiecărui rezultat din cererile proxy urllib3 concurente
Partajați un ProxyManager configurat între firele de lucru, consumați iteratorul de rezultate al executorului și distingeți păstrarea în pool de o limită de conexiuni.
Crearea unui pool de lucrători nu îi oferă apelantului paginile descărcate. Păstrați și consumați valorile returnate de lucrarea trimisă:
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()Acest fragment presupune o listă limitată de URL-uri și dimensiuni obișnuite ale răspunsului. Pentru verificări permise ale URL-urilor publice fără autentificare proxy, un candidat din lista de proxy HTTP poate înlocui punctul final HTTP exemplu al managerului. Fiecare rezultat își include URL-ul, astfel încât apelantul să poată asocia starea și corpul cu cererea corectă. map returnează rezultatele în ordinea de intrare; o excepție într-un lucrător este ridicată atunci când rezultatul respectiv este preluat.
ProxyManagerul configurat deține pool-ul de conexiuni pentru cereri. Cu modul implicit de răspuns preîncărcat folosit aici, urllib3 citește corpul și returnează conexiunea în pool-ul său. O versiune de streaming ar necesita consum explicit și eliberarea conexiunii.
maxsize controlează de obicei conexiunile reutilizabile păstrate, nu o limită strictă pentru fiecare socket deschis. block=True schimbă comportamentul relevant al pool-ului, astfel încât apelanții să aștepte o conexiune liberă în loc să deschidă altele suplimentare peste limita acelui pool.
Numărul de lucrători limitează apelurile concurente în acest exemplu. Cu multe destinații, contează și aspectul pool-ului și ruta folosită pentru tunelurile HTTPS; o setare pentru un singur pool nu trebuie descrisă ca o cotă globală de socketuri pentru fiecare gazdă.