Proxykészlet megosztása Python szálak között egy sorral
Használjon szinkronizált sort és finally blokkot, hogy lefoglaljon egy proxyt egy szinkron szálművelethez, majd utána visszaadja.
Amikor több szál osztozik egy kis proxykészleten, egy véletlenszerű bejegyzés kiválasztása ugyanazt a proxyt adhatja két aktív műveletnek. Egy sor tárolhatja a jelenleg kölcsönzésre elérhető bejegyzéseket:
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)
Építse fel a sort egyszer, a munkaszálak indítása előtt. A proxy_urls teljes végpont URL-eket tartalmaz. A nyilvános jelöltek a ingyenes proxylistán érhetők el; használja azt a protokollt és URL-formátumot, amelyet a fetch_one támogat. A meglévő szinkron fetch_one függvénynek visszatérés előtt be kell fejeznie a hálózati műveletét, és be kell zárnia minden választ. Ellenkező esetben a kölcsönzés akkor ér véget, amikor a kapcsolat még azt a proxyt használja.
A Queue.get atomikusan eltávolít egy elérhető bejegyzést. A kimerült készlet várakozik, ahelyett hogy ismételten megosztott jelzőket vizsgálna. Ha öt másodpercen belül nem érkezik bejegyzés, a queue.Empty eléri a hívót; válassza ki az alkalmazás újrapróbálkozási, hiba- vagy megszakítási szabályát erre az eredményre.
A finally blokk visszaadja a megszerzett bejegyzést siker vagy kivétel után. Nem jelenti ki, hogy a sikertelen végpont egészséges. A karantén-, csere- és lehűlési szabályoknak kifejezett útra van szükségük, ahelyett hogy csendben eldobnák minden proxyt, amely átmeneti hibát lát.
Az azonos URL-karakterláncok deduplikálása megakadályozza a duplikált sorbejegyzéseket. A különböző URL-ek továbbra is ugyanarra a fizikai proxyra vagy kijáratra utalhatnak; csoportosítsa őket szándékosan, ha a kizárólagosságnak arra a megosztott erőforrásra kell vonatkoznia. A sor az e folyamaton belüli szálakat hangolja össze, nem más gépeken futó munkásokat.