Python жиптеринин ортосунда прокси бассейнин кезек менен бөлүшүү
Синхрондоштурулган кезек жана finally блогун колдонуп, синхрондук жип операциясы үчүн бир проксини брондап, анан кайтарыңыз.
Бир нече жип кичинекей прокси бассейнин бөлүшкөндө, туш келди жазууну тандоо эки активдүү операцияга бирдей прокси бере алат. Кезек азыр карызга алууга жеткиликтүү жазууларды кармай алат:
from contextlib import contextmanager
from queue import Queue
available = Queue()
for endpoint in dict.fromkeys(proxy_urls):
available.put(endpoint)
@contextmanager
def borrow_proxy():
endpoint = available.get(timeout=5)
try:
yield endpoint
finally:
available.put(endpoint)
def process_url(url):
with borrow_proxy() as endpoint:
return fetch_one(url, endpoint)
Кезекти жумушчу жиптерди баштоодон мурун бир жолу түзүңүз. proxy_urls толук endpoint URL даректерин камтыйт. Коомдук талапкерлер бекер прокси тизмесинде бар; fetch_one колдогон протокол жана URL форматын пайдаланыңыз. Учурдагы синхрондук fetch_one функциясы кайтуудан мурун тармактык операциясын бүтүрүп, ар кандай жоопту жабууга тийиш. Болбосо, байланыш дагы эле ошол проксини колдонуп жатканда ижара бүтөт.
Queue.get бир жеткиликтүү жазууну атомдук түрдө алып салат. Бүткөн бассейн жалпы флагларды кайра-кайра сканерлөөнүн ордуна күтөт. Эгер беш секунд ичинде жазуу келбесе, queue.Empty чакыруучуга жетет; бул натыйжа үчүн колдонмонун кайталоо, ийгиликсиздик же жокко чыгаруу саясатын тандаңыз.
finally блогу ийгиликтен же өзгөчөлүктөн кийин алынган жазууну кайтарат. Ал ийгиликсиз endpoint ден соолугу жакшы деп жарыялабайт. Карантин, алмаштыруу жана муздатуу саясаттары убактылуу ката көргөн ар бир проксини үнсүз таштап салуунун ордуна так жолду талап кылат.
Бирдей URL саптарынын кайталанышын жоюу кезектеги кош жазууларды болтурбайт. Ар башка URL дагы эле бир физикалык проксиге же чыгууга шилтеши мүмкүн; эгер өзгөчөлүк ошол жалпы ресурска тийиштүү болушу керек болсо, аларды атайын топтоңуз. Кезек ушул процесс ичиндеги жиптерди шайкештештирет, башка машиналардагы жумушчуларды эмес.