Stvaranje radnog bazena ne daje pozivatelju preuzete stranice. Sačuvajte i trošite vrijednosti koje vraća poslani posao:

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

Ovaj ulomak pretpostavlja ograničen popis URL-ova i uobičajene veličine odgovora. Za dopuštene provjere javnih URL-ova bez proxy autentifikacije, kandidat s popisa HTTP proxyja može zamijeniti primjer HTTP završne točke upravitelja. Svaki rezultat uključuje svoj URL kako bi pozivatelj mogao povezati status i tijelo s ispravnim zahtjevom. map vraća rezultate u redoslijedu unosa; iznimka u radniku podiže se kada se taj rezultat dohvati.

Konfigurirani ProxyManager posjeduje bazen veza za zahtjeve. Uz ovdje korišteni zadani način unaprijed učitanog odgovora, urllib3 čita tijelo i vraća vezu u svoj bazen. Streaming verzija zahtijevala bi eksplicitnu potrošnju i oslobađanje veze.

maxsize obično kontrolira zadržane višekratno upotrebljive veze, a ne tvrdo ograničenje na svaki otvoreni socket. block=True mijenja relevantno ponašanje bazena tako da pozivatelji čekaju slobodnu vezu umjesto da otvaraju dodatne iznad ograničenja tog bazena.

Broj radnika ograničava paralelne pozive u ovom primjeru. S mnogo odredišta, raspored bazena i ruta koja se koristi za HTTPS tunele također su važni; postavka jednog bazena ne smije se opisivati kao jedna globalna kvota soketa za svakog hosta.

Povezani članci