Zbierať každý výsledok zo súbežných proxy požiadaviek urllib3
Zdieľajte nakonfigurovaný ProxyManager medzi pracovnými vláknami, konzumujte iterátor výsledkov exekútora a rozlišujte udržiavanie v pule od limitu pripojení.
Vytvorenie pracovného pultu nedáva volajúcemu stiahnuté stránky. Uchovajte a konzumujte hodnoty vrátené odoslanou prácou:
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()Tento fragment predpokladá obmedzený zoznam URL a obvyklé veľkosti odpovedí. Pre povolené kontroly verejných URL bez proxy autentifikácie môže kandidát zo zoznamu HTTP proxy nahradiť ukážkový HTTP koncový bod správcu. Každý výsledok obsahuje svoju URL, aby volajúci mohol priradiť stav a telo k správnej požiadavke. map vracia výsledky v poradí vstupu; výnimka v pracovnom vlákne sa vyhodí pri načítaní daného výsledku.
Nakonfigurovaný ProxyManager vlastní fond pripojení pre požiadavky. S predvoleným režimom prednačítanej odpovede použitým tu urllib3 prečíta telo a vráti pripojenie do svojho fondu. Streamovacia verzia by vyžadovala explicitnú spotrebu a uvoľnenie pripojenia.
maxsize zvyčajne riadi udržiavané opakovane použiteľné pripojenia, nie tvrdý limit na každý otvorený socket. block=True mení príslušné správanie fondu, takže volajúci čakajú na voľné pripojenie namiesto otvárania ďalších nad limit tohto fondu.
Počet pracovníkov obmedzuje súbežné volania v tomto príklade. Pri mnohých cieľoch záleží aj na usporiadaní fondu a trase používanej pre tunely HTTPS; nastavenie jedného fondu by sa nemalo opisovať ako jedna globálna kvóta socketov pre každého hostiteľa.