Wakati nyuzi kadhaa zinashiriki bwawa dogo la proksi, kuchagua ingizo bila mpangilio kunaweza kuwapa operesheni mbili hai proksi sawa. Foleni inaweza kushikilia ingizo zinazopatikana kwa kukopa kwa sasa:

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)

Jenga foleni mara moja, kabla ya kuanza nyuzi za kazi. proxy_urls ina URL kamili za mwisho. Wagombea wa umma wanapatikana katika orodha ya proksi za bure; tumia itifaki na muundo wa URL unaoungwa mkono na fetch_one. Kitendakazi kilichopo cha fetch_one cha kusawazisha lazima kikamilishe operesheni yake ya mtandao na kufunga jibu lolote kabla ya kurudi. Vinginevyo ukodishaji ungeisha wakati muunganisho bado unatumia proksi hiyo.

Queue.get huondoa ingizo moja inayopatikana kwa njia ya atomiki. Bwawa lililoisha husubiri badala ya kuchanganua bendera za pamoja mara kwa mara. Ikiwa hakuna ingizo litakalofika ndani ya sekunde tano, queue.Empty hufika kwa mpigaji simu; chagua sera ya jaribio upya, kushindwa au kughairi ya programu kwa matokeo hayo.

Kizuizi cha finally hurudisha ingizo lililopatikana baada ya mafanikio au ubaguzi. Hakitangazi kwamba mwisho ulioshindwa ni mzima. Sera za karantini, uingizwaji na upozaji zinahitaji njia iliyo wazi badala ya kutupa kwa utulivu kila proksi inayoona hitilafu ya muda.

Kuondoa nakala za mifuatano ya URL inayofanana huzuia ingizo maradufu kwenye foleni. URL tofauti bado zinaweza kurejelea proksi sawa ya kimwili au kutoka; zipange kwa makusudi ikiwa upekee unapaswa kutumika kwa rasilimali hiyo inayoshirikiwa. Foleni huratibu nyuzi katika mchakato huu, sio wafanyakazi kwenye mashine nyingine.

Makala zinazohusiana