Ibahagi ang proxy pool sa pagitan ng mga thread ng Python gamit ang queue
Gumamit ng naka-synchronize na queue at finally block para magreserba ng isang proxy para sa synchronous na operasyon ng thread at ibalik ito pagkatapos.
Kapag maraming thread ang nagbabahagi ng maliit na proxy pool, ang pagpili ng random na entry ay maaaring magbigay ng parehong proxy sa dalawang aktibong operasyon. Ang queue ay maaaring maghawak ng mga entry na kasalukuyang available na hiramin:
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)
Buuin ang queue nang isang beses, bago simulan ang mga worker thread. Ang proxy_urls ay naglalaman ng kumpletong endpoint URL. Ang mga pampublikong kandidato ay available sa listahan ng libreng proxy; gamitin ang protocol at format ng URL na sinusuportahan ng fetch_one. Ang umiiral na synchronous na fetch_one function ay dapat tapusin ang network operation nito at isara ang anumang tugon bago bumalik. Kung hindi, matatapos ang paghiram habang ginagamit pa ng koneksyon ang proxy na iyon.
Inaalis ng Queue.get ang isang available na entry nang atomic. Ang naubos na pool ay naghihintay sa halip na paulit-ulit na i-scan ang mga shared flag. Kung walang entry na dumating sa limang segundo, naaabot ng queue.Empty ang tumatawag; piliin ang patakaran ng muling pagtatangkang, pagkabigo o pagkansela ng application para sa resultang iyon.
Ibinabalik ng finally block ang isang entry na nakuha pagkatapos ng tagumpay o exception. Hindi nito idinedeklara na malusog ang isang nabigong endpoint. Ang mga patakaran ng quarantine, pagpapalit at paglamig ay nangangailangan ng malinaw na landas sa halip na tahimik na itapon ang bawat proxy na nakakita ng pansamantalang error.
Ang pag-alis ng mga doble sa magkatulad na URL string ay pumipigil sa dobleng entry sa queue. Ang magkaibang URL ay maaari pa ring tumukoy sa parehong pisikal na proxy o labasan; pangkatin ang mga ito nang sadya kung ang pagiging eksklusibo ay dapat na mag-apply sa shared resource na iyon. Ang queue ay nag-uugnay ng mga thread sa prosesong ito, hindi ang mga worker sa ibang makina.