Дељење прокси скупа између 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 садржи потпуне URL адресе крајњих тачака. Јавни кандидати доступни су на листи бесплатних проксија; користите протокол и формат URL-а које fetch_one подржава. Постојећа синхрона функција fetch_one мора да заврши своју мрежну операцију и затвори сваки одговор пре повратка. Иначе би позајмица завршила док веза још користи тај прокси.
Queue.get атомски уклања један доступан унос. Исцрпљен скуп чека уместо да више пута скенира дељене заставице. Ако унос не стигне у року од пет секунди, queue.Empty долази до позиваоца; изаберите политику поновног покушаја, неуспеха или отказивања апликације за тај резултат.
Блок finally враћа преузети унос након успеха или изузетка. Он не тврди да је неуспешна крајња тачка здрава. Политике карантина, замене и хлађења захтевају изричит пут уместо тихог одбацивања сваког проксија који види привремену грешку.
Уклањање дупликата идентичних URL низова спречава двоструке уносе у реду. Различити URL-ови и даље могу упућивати на исти физички прокси или излаз; групишите их намерно ако ексклузивност треба да важи за тај дељени ресурс. Ред усклађује нити у овом процесу, а не раднике на другим машинама.