Збіраць кожны вынік з паралельных проксі-запытаў urllib3
Дзяліцеся настроеным ProxyManager паміж працоўнымі патокамі, спажывайце ітэратар вынікаў выканаўцы і адрознівайце захаванне пула ад абмежавання злучэнняў.
Стварэнне пула працоўных не перадае выклікальніку спампаваныя старонкі. Захоўвайце і спажывайце значэнні, якія вяртае адпраўленая праца:
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()Гэты фрагмент мяркуе абмежаваны спіс URL і звычайныя памеры адказаў. Для дазволеных праверках публічных URL без проксі-аўтэнтыфікацыі кандыдат са спісу HTTP-проксі можа замяніць прыкладны HTTP-эндпоінт менеджара. Кожны вынік утрымлівае свой URL, каб выклікальнік мог звязаць статус і цела з правільным запытам. map вяртае вынікі ў парадку ўводу; выключэнне ў працоўным узнікае, калі гэты вынік запытваецца.
Настроены ProxyManager валодае пулам злучэнняў для запытаў. З прадвызначаным рэжымам папярэдне загружанага адказу, які выкарыстоўваецца тут, urllib3 чытае цела і вяртае злучэнне ў свой пул. Патокавая версія патрабавала б явнага спажывання і вызвалення злучэння.
maxsize звычайна кіруе захаванымі шматразова выкарыстоўванымі злучэннямі, а не жорсткім абмежаваннем на кожны адкрыты сокет. block=True змяняе адпаведныя паводзіны пула, каб выклікальнікі чакалі вольнае злучэнне, а не адкрывалі дадатковыя звыш ліміту гэтага пула.
Колькасць працоўных абмяжоўвае адначасовыя выклікі ў гэтым прыкладзе. Пры мностве прызначэнняў таксама важныя схема пула і маршрут для тунеляў HTTPS; наладу аднаго пула нельга апісваць як адзіную глабальную квоту сокетаў для кожнага хоста.