Zbrati vsak rezultat iz sočasnih proxy zahtev urllib3
Delite konfigurirani ProxyManager med delovnimi nitmi, porabljajte iterator rezultatov izvajalca in ločite zadrževanje v bazenu od omejitve povezav.
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.