Deel 'n proxiepoel tussen Python-drade met 'n tou
Gebruik 'n gesinkroniseerde tou en 'n finally-blok om een proxy vir een sinchroniese draadbewerking te reserveer en dit daarna terug te gee.
Wanneer verskeie drade 'n klein proxiepoel deel, kan die keuse van 'n ewekansige inskrywing twee aktiewe bewerkings dieselfde proxy gee. 'n Tou kan die inskrywings hou wat tans beskikbaar is om te leen:
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)
Bou die tou een keer voordat die werkdrade begin. proxy_urls bevat volledige eindpunt-URL's. Openbare kandidate is beskikbaar in die gratis proxilys; gebruik die protokol en URL-formaat wat fetch_one ondersteun. Die bestaande sinchroniese fetch_one-funksie moet sy netwerkbewerking voltooi en enige antwoord sluit voordat dit terugkeer. Andersins sou die lease eindig terwyl die verbinding nog daardie proxy gebruik.
Queue.get verwyder een beskikbare inskrywing atomies. 'n Uitgeputte poel wag eerder as om herhaaldelik gedeelde vlae te skandeer. As geen inskrywing binne vyf sekondes opdaag nie, bereik queue.Empty die oproeper; kies die toepassing se herprobeer-, mislukking- of kansellasiebeleid vir daardie resultaat.
Die finally-blok gee 'n verkrygde inskrywing terug na sukses of 'n uitsondering. Dit verklaar nie dat 'n mislukte eindpunt gesond is nie. Kwarantyn-, vervangings- en afkoelbeleide het 'n eksplisiete pad nodig eerder as om elke proxy wat 'n tydelike fout sien, stilweg te verwerp.
Deduplisering van identiese URL-stringe verhoed duplikaat-touinskrywings. Afsonderlike URL's kan steeds na dieselfde fisiese proxy of uitgang verwys; groepeer dié doelbewus as eksklusiwiteit op daardie gedeelde hulpbron moet geld. Die tou koordineer drade in hierdie proses, nie werkers op ander masjiene nie.