Minden eredmény összegyűjtése párhuzamos urllib3-proxykérésekből
Osszon meg egy beállított ProxyManagert a munkaszálak között, fogyassza a végrehajtó eredmény-iterátorát, és különböztesse meg a készlet megtartását a kapcsolati korláttól.
Munkás-készlet létrehozása nem adja át a hívónak a letöltött oldalakat. Őrizze meg és fogyassza a beküldött munka által visszaadott értékeket:
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()Ez a részlet korlátozott URL-listát és szokásos válaszméreteket feltételez. Az engedélyezett nyilvános URL-ellenőrzésekhez proxyhitelesítés nélkül az HTTP-proxylistáról származó jelölt helyettesítheti a kezelő példa HTTP-végpontját. Minden eredmény tartalmazza a saját URL-jét, hogy a hívó az állapotot és a törzset a helyes kéréshez rendelhesse. A map a bemeneti sorrendben adja vissza az eredményeket; a munkásban keletkező kivétel akkor emelődik, amikor azt az eredményt lekérik.
A beállított ProxyManager birtokolja a kérések kapcsolatkészletét. Az itt használt alapértelmezett előre betöltött válaszmóddal az urllib3 beolvassa a törzset, és visszaadja a kapcsolatot a készletébe. Egy streamelő változatnak kifejezett fogyasztásra és a kapcsolat felszabadítására lenne szüksége.
A maxsize általában a megtartott újrafelhasználható kapcsolatokat szabályozza, nem pedig kemény korlátot jelent minden megnyitott socketre. A block=True megváltoztatja a vonatkozó készletviselkedést, hogy a hívók szabad kapcsolatra várjanak, ahelyett hogy az adott készlet korlátján felül továbbiakat nyitnának.
A munkások száma ebben a példában korlátozza az egyidejű hívásokat. Sok cél esetén a készlet elrendezése és a HTTPS-alagutakhoz használt útvonal is számít; egy készlet beállítását nem szabad egyetlen globális socketkvótaként leírni minden hoszt számára.