Dijeljenje skupa proxyja među Python nitima pomoću reda
Upotrijebite sinkronizirani red i blok finally da rezervirate jedan proxy za sinkronu nitnu operaciju i vratite ga nakon toga.
Kada nekoliko niti dijeli mali skup proxyja, odabir slučajnog unosa može dvjema aktivnim operacijama dati isti proxy. Red može držati unose koji su trenutačno 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 završnih točaka. Javni kandidati dostupni su na popisu besplatnih proxyja; upotrijebite protokol i format URL-a koje fetch_one podržava. Postojeća sinkrona funkcija fetch_one mora završiti svoju mrežnu operaciju i zatvoriti svaki odgovor prije povratka. Inače bi posudba završila dok veza još koristi taj proxy.
Queue.get atomski uklanja jedan dostupni unos. Iscrpljen skup čeka umjesto da više puta pregledava 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 završna točka zdrava. Politike karantene, zamjene i hlađenja trebaju izričit put umjesto tihog odbacivanja svakog proxyja 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.