Deila proxy-safni milli Python-þráða með biðröð
Notið samstillta biðröð og finally-blokk til að taka eitt proxy frá fyrir samstillta þráðaaðgerð og skila því aftur á eftir.
Þegar nokkrir þræðir deila litlu proxy-safni getur val á handahófskenndri færslu gefið tveimur virkum aðgerðum sama proxyið. Biðröð getur geymt færslurnar sem eru í boði til láns núna:
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)
Byggið biðröðina einu sinni, áður en vinnuþræðirnir hefjast. proxy_urls inniheldur fullar URL-slóðir endapunkta. Opinberir kandídatar eru í boði á listanum yfir ókeypis proxý; notið þá siðvenju og URL-snið sem fetch_one styður. Núverandi samstillta fetch_one-fallið verður að ljúka netaðgerð sinni og loka hverju svari áður en það snýr aftur. Annars myndi lánið enda á meðan tengingin notar enn það proxy.
Queue.get fjarlægir eina færslu sem er í boði á atómískan hátt. Tæmt safn bíður í stað þess að skanna sameiginleg fána aftur og aftur. Ef engin færsla berst innan fimm sekúndna nær queue.Empty til kallandans; veljið endurtilraunastefnu, bilunarstefnu eða afturköllunarstefnu forritsins fyrir þá niðurstöðu.
Finally-blokkin skilar fenginni færslu eftir árangur eða undantekningu. Hún lýsir því ekki yfir að misheppnaður endapunktur sé heilbrigður. Sóttkvíunar-, skipti- og kælingastefnur þurfa skýra leið í stað þess að henda hljóðlega hverju proxyi sem sér tímabundna villu.
Afritunarsía á eins URL-strengjum kemur í veg fyrir tvöfaldar biðraðarfærslur. Ólíkar URL-slóðir geta samt vísað á sama líkamlega proxy eða útgang; flokkið þær viljandi ef einkaréttur á að gilda um þá sameiginlegu auðlind. Biðröðin samhæfir þræði í þessu ferli, ekki vinnur á öðrum vélum.