Työntekijäaltaan luominen ei anna kutsujalle ladattuja sivuja. Säilytä ja kuluta lähetetyn työn palauttamat arvot:

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

Tämä katkelma olettaa rajatun URL-luettelon ja tavalliset vastauskoot. Sallituille julkisten URL-osoitteiden tarkistuksille ilman välityspalvelimen todennusta HTTP-välityspalvelinluettelosta peräisin oleva ehdokas voi korvata hallinnan esimerkki-HTTP-päätepisteen. Jokainen tulos sisältää URL-osoitteensa, jotta kutsuja voi yhdistää tilan ja rungon oikeaan pyyntöön. map palauttaa tulokset syöttöjärjestyksessä; työntekijän poikkeus nostetaan, kun kyseinen tulos haetaan.

Määritetty ProxyManager omistaa pyyntöjen yhteysaltaan. Tässä käytetyllä oletusarvoisella esiladatun vastauksen tilalla urllib3 lukee rungon ja palauttaa yhteyden altaaseensa. Suoratoistoversio vaatisi eksplisiittisen kulutuksen ja yhteyden vapauttamisen.

maxsize ohjaa tavallisesti säilytettyjä uudelleenkäytettäviä yhteyksiä, ei kovaa ylärajaa jokaiselle avatulle socketille. block=True muuttaa kyseisen altaan käyttäytymistä niin, että kutsujat odottavat vapaata yhteyttä sen sijaan, että avaisivat lisää kyseisen altaan rajan yli.

Työntekijöiden määrä rajoittaa samanaikaisia kutsuja tässä esimerkissä. Kun kohteita on paljon, myös altaan asettelu ja HTTPS-tunneleihin käytetty reitti ovat merkityksellisiä; yhden altaan asetusta ei pitäisi kuvata yhtenä globaalina socket-kiintiönä jokaiselle isännälle.

Aiheeseen liittyvät artikkelit