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.

Kapcsolódó cikkek