Dijeljenje proxy skupa među Python nitima pomoću reda
Koristite sinhronizirani red i blok finally da rezervišete jedan proxy za sinhronu nitnu operaciju i vratite ga nakon toga.
Kada nekoliko niti dijeli mali proxy skup, odabir slučajnog unosa može dvjema aktivnim operacijama dati isti proxy. Red može držati unose koji su trenutno dostupni za posudbu:
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)
Izgradite red jednom, prije pokretanja radnih niti. proxy_urls sadrži potpune URL adrese krajnjih točaka. Javni kandidati dostupni su na popisu besplatnih proxija; koristite protokol i format URL-a koje fetch_one podržava. Postojeća sinhrona funkcija fetch_one mora završiti svoju mrežnu operaciju i zatvoriti svaki odgovor prije povratka. Inače bi najam završio dok veza još koristi taj proxy.
Queue.get atomski uklanja jedan dostupni unos. Iscrpljen skup čeka umjesto da više puta skenira zajedničke zastavice. Ako unos ne stigne u roku od pet sekundi, queue.Empty dolazi do pozivatelja; odaberite politiku ponovnog pokušaja, neuspjeha ili otkazivanja aplikacije za taj rezultat.
Blok finally vraća preuzeti unos nakon uspjeha ili iznimke. On ne tvrdi da je neuspjela krajnja točka zdrava. Politike karantene, zamjene i hlađenja trebaju izričit put umjesto tihog odbacivanja svakog proxija koji vidi privremenu pogrešku.
Uklanjanje duplikata identičnih URL nizova sprječava dvostruke unose u redu. Različiti URL-ovi još uvijek mogu upućivati na isti fizički proxy ili izlaz; namjerno ih grupirajte ako se ekskluzivnost mora primijeniti na taj zajednički resurs. Red usklađuje niti u ovom procesu, a ne radnike na drugim strojevima.