Een werkpool maken geeft de aanroeper niet de gedownloade pagina's. Bewaar en verbruik de waarden die het ingediende werk teruggeeft:

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()

Dit fragment veronderstelt een begrensde URL-lijst en gewone responsgroottes. Voor toegestane openbare URL-controles zonder proxy-authenticatie kan een kandidaat uit de HTTP-proxylijst het voorbeeld-HTTP-eindpunt van de beheerder vervangen. Elk resultaat bevat zijn URL zodat de aanroeper status en body aan het juiste verzoek kan koppelen. map retourneert resultaten in invoervolgorde; een uitzondering in een werker wordt opgeworpen wanneer dat resultaat wordt opgehaald.

De geconfigureerde ProxyManager bezit de verbindingspool voor de verzoeken. Met de hier gebruikte standaard vooraf geladen responsmodus leest urllib3 de body en geeft de verbinding terug aan zijn pool. Een streamingversie zou expliciet verbruik en vrijgave van de verbinding vereisen.

maxsize beheert normaal gesproken bewaarde herbruikbare verbindingen, geen harde limiet op elke geopende socket. block=True wijzigt het relevante poolgedrag zodat aanroepers op een vrije verbinding wachten in plaats van extra verbindingen boven de limiet van die pool te openen.

Het aantal werkers begrenst gelijktijdige aanroepen in dit voorbeeld. Bij veel bestemmingen zijn ook de poolindeling en de route voor HTTPS-tunnels van belang; een instelling per pool mag niet worden beschreven als één globale socketquota voor elke host.

Gerelateerde artikelen