Python thread-үүдийн хооронд прокси санг дараалал ашиглан хуваалцах
Синхрончлогдсон дараалал болон finally блок ашиглан синхрон thread үйлдэлд нэг прокси нөөцөлж, дараа нь буцааж өгнө үү.
Хэд хэдэн thread жижиг прокси санг хуваалцах үед санамсаргүй бичлэг сонгох нь хоёр идэвхтэй үйлдэлд нэг прокси өгч болно. Дараалал нь одоо зээлэхэд боломжтой бичлэгүүдийг хадгалж болно:
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)
Ажилчин thread-үүдийг эхлүүлэхийн өмнө дарааллыг нэг удаа бүтээ. proxy_urls нь бүрэн endpoint URL агуулна. Нийтийн нэр дэвшигчид үнэгүй прокси жагсаалтад байдаг; fetch_one-ийн дэмждэг протокол болон URL форматыг ашигла. Одоо байгаа синхрон fetch_one функц буцахаас өмнө сүлжээний үйлдлээ дуусгаж, ямар ч хариултыг хаах ёстой. Үгүй бол холболт тэр проксиг ашиглаж байх хооронд түрээс дуусна.
Queue.get нэг боломжтой бичлэгийг атомаар устгана. Хоосорсон сан хуваалцсан флагуудыг дахин дахин скан хийхийн оронд хүлээнэ. Таван секундын дотор бичлэг ирэхгүй бол queue.Empty дуудагч руу хүрнэ; тэр үр дүнд зориулж програмын дахин оролдлого, бүтэлгүйтэл эсвэл цуцлалтын бодлогыг сонго.
finally блок амжилт эсвэл үл хамаарах зүйлийн дараа авсан бичлэгийг буцаана. Энэ нь бүтэлгүй endpoint эрүүл гэж зарлахгүй. Карантин, орлуулалт болон хөргөлтийн бодлогод түр зуурын алдаа харсан прокси бүрийг чимээгүй хаяхын оронд тодорхой зам хэрэгтэй.
Ижил URL мөрүүдийн давхардлыг арилгах нь дараалалд давхар бичлэг үүсэхээс сэргийлнэ. Өөр URL-ууд ижил физик прокси эсвэл гаралт руу зааж болно; хэрэв онцгой эрх тэр хуваалцсан нөөцөд хамаарах бол тэдгээрийг санаатайгаар бүлэглэ. Дараалал нь энэ процессын thread-үүдийг зохицуулдаг, бусад машины ажилчдыг биш.