Ustvarjanje delovnega bazena klicatelju ne preda prenesenih strani. Shranite in porabite vrednosti, ki jih vrne poslano delo:

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

Ta odlomek predpostavlja omejen seznam URL-jev in običajne velikosti odgovorov. Za dovoljena preverjanja javnih URL-jev brez proxy preverjanja pristnosti lahko kandidat s seznama proxy strežnikov HTTP nadomesti primer končne točke HTTP upravitelja. Vsak rezultat vključuje svoj URL, da lahko klicatelj stanje in telo poveže s pravilno zahtevo. map vrne rezultate v vrstnem redu vnosa; izjema v delavcu se sproži, ko je ta rezultat pridobljen.

Konfigurirani ProxyManager ima bazen povezav za zahteve. Z privzetim načinom prednaloženega odgovora, ki se uporablja tukaj, urllib3 prebere telo in vrne povezavo v svoj bazen. Pretočna različica bi zahtevala izrecno porabo in sprostitev povezave.

maxsize običajno nadzoruje zadržane večkrat uporabne povezave, ne pa trde omejitve za vsak odprt vtič. block=True spremeni ustrezno vedenje bazena, tako da klicatelji čakajo na prosto povezavo, namesto da bi odpirali dodatne nad omejitvijo tega bazena.

Število delavcev v tem primeru omejuje sočasne klice. Pri številnih ciljih so pomembni tudi postavitev bazena in pot, ki se uporablja za tunele HTTPS; nastavitve enega bazena ne smemo opisovati kot enotne globalne kvote vtičev za vsakega gostitelja.

Sorodni članki