Indsaml hvert resultat fra samtidige urllib3-proxyforespørgsler
Del en konfigureret ProxyManager mellem arbejdstråde, forbrug executor'ens resultatiterator, og skel mellem poolbevaring og en forbindelsesgrænse.
At oprette en arbejderpool giver ikke kalderen de downloadede sider. Behold og forbrug de værdier, som det indsendte arbejde 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()Dette uddrag antager en afgrænset liste af URL'er og almindelige svarstørrelser. Til tilladte offentlige URL-kontroller uden proxygodkendelse kan en kandidat fra HTTP-proxylisten erstatte managerens eksempel-HTTP-endpoint. Hvert resultat indeholder sin URL, så kalderen kan knytte status og body til den rigtige forespørgsel. map returnerer resultater i inputrækkefølge; en undtagelse i en arbejder rejses, når det resultat hentes.
Den konfigurerede ProxyManager ejer forbindelsespuljen til forespørgslerne. Med den forvalgte forudindlæste svartilstand, der bruges her, læser urllib3 body og returnerer forbindelsen til sin pulje. En streamingversion ville kræve eksplicit forbrug og frigivelse af forbindelsen.
maxsize styrer normalt bevarede genbrugelige forbindelser, ikke en hård grænse for hver åbnet socket. block=True ændrer den relevante puljeadfærd, så kaldere venter på en ledig forbindelse i stedet for at åbne yderligere ud over den puljes grænse.
Antallet af arbejdere begrænser samtidige kald i dette eksempel. Med mange destinationer betyder puljelayout og ruten til HTTPS-tunneler også noget; en indstilling pr. pulje bør ikke beskrives som en global socketkvote for hver vært.