Параллель 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 туннелдери үчүн колдонулган маршрут да маанилүү; бир пулдун жөндөөсүн ар бир хост үчүн бирдиктүү глобалдык сокет квотасы деп сүрөттөөгө болбойт.