Бірнеше ағын шағын прокси пулын бөліскенде, кездейсоқ жазбаны таңдау екі белсенді операцияға бірдей проксиді беруі мүмкін. Кезек қазір қарызға алуға қолжетімді жазбаларды ұстай алады:

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 әлі де бір физикалық проксиге немесе шығуға сілтеуі мүмкін; егер айрықшалық сол ортақ ресурсқа қолданылуы керек болса, оларды әдейі топтастырыңыз. Кезек осы процестегі ағындарды үйлестіреді, басқа машиналардағы жұмысшыларды емес.

Қатысты мақалалар