Apkopot katru rezultātu no vienlaicīgiem urllib3 starpniekservera pieprasījumiem
Kopīgojiet konfigurētu ProxyManager starp darba pavedieniem, patērējiet izpildītāja rezultātu iteratoru un atšķiriet baseina saglabāšanu no savienojumu ierobežojuma.
Darbinieku baseina izveide nepiešķir izsaucējam lejupielādētās lapas. Saglabājiet un patērējiet vērtības, ko atgriež iesniegtais darbs:
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()Šis fragments pieņem ierobežotu URL sarakstu un parastus atbildes izmērus. Atļautām publisku URL pārbaudēm bez starpniekservera autentifikācijas kandidāts no HTTP starpniekserveru saraksta var aizstāt pārvaldnieka parauga HTTP galapunktu. Katrs rezultāts ietver savu URL, lai izsaucējs varētu saistīt statusu un saturu ar pareizo pieprasījumu. map atgriež rezultātus ievades secībā; izņēmums darbiniekā tiek izmests, kad šis rezultāts tiek izgūts.
Konfigurētais ProxyManager pārvalda pieprasījumu savienojumu baseinu. Ar šeit izmantoto noklusējuma iepriekš ielādētās atbildes režīmu urllib3 nolasa saturu un atgriež savienojumu savā baseinā. Straumēšanas versijai būtu nepieciešama skaidra patērēšana un savienojuma atbrīvošana.
maxsize parasti kontrolē saglabātos atkārtoti lietojamos savienojumus, nevis stingru ierobežojumu katram atvērtajam ligzdai. block=True maina attiecīgo baseina uzvedību, lai izsaucēji gaidītu brīvu savienojumu, nevis atvērtu papildu savienojumus virs šī baseina limita.
Darbinieku skaits šajā piemērā ierobežo vienlaicīgus izsaukumus. Ar daudziem galamērķiem svarīgs ir arī baseina izvietojums un maršruts, kas tiek izmantots HTTPS tuneļiem; viena baseina iestatījumu nevajadzētu aprakstīt kā vienu globālu ligzdu kvotu katram resursdatoram.