Vytvoření pracovního poolu nedává volajícímu stažené stránky. Uchovejte a konzumujte hodnoty vrácené odeslanou prací:

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 předpokládá omezený seznam URL a obvyklé velikosti odpovědí. Pro povolené kontroly veřejných URL bez proxy autentizace může kandidát ze seznamu HTTP proxy nahradit ukázkový HTTP koncový bod správce. Každý výsledek obsahuje svou URL, aby volající mohl přiřadit stav a tělo ke správnému požadavku. map vrací výsledky v pořadí vstupu; výjimka v pracovním vlákně se vyhodí při načtení daného výsledku.

Nakonfigurovaný ProxyManager vlastní pool připojení pro požadavky. S výchozím režimem přednačtené odpovědi použitým zde urllib3 přečte tělo a vrátí připojení do svého poolu. Streamovací verze by vyžadovala explicitní spotřebu a uvolnění připojení.

maxsize obvykle řídí udržovaná znovupoužitelná připojení, nikoli tvrdý limit na každý otevřený socket. block=True mění příslušné chování poolu, takže volající čekají na volné připojení, místo aby otevírali další nad limit tohoto poolu.

Počet pracovníků omezuje souběžná volání v tomto příkladu. Při mnoha cílech záleží také na uspořádání poolu a trase použité pro tunely HTTPS; nastavení jednoho poolu by nemělo být popisováno jako jedna globální kvóta socketů pro každého hostitele.

Související články