Birkaç iş parçacığı küçük bir proxy havuzunu paylaştığında, rastgele bir girdi seçmek iki etkin işleme aynı proxy'yi verebilir. Bir kuyruk, şu anda ödünç alınabilir girdileri tutabilir:

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)

Kuyruğu, çalışan iş parçacıklarını başlatmadan önce bir kez oluşturun. proxy_urls tam uç nokta URL'lerini içerir. Genel adaylar ücretsiz proxy listesinde bulunur; fetch_one'ın desteklediği protokolü ve URL biçimini kullanın. Mevcut eşzamanlı fetch_one işlevi, dönmeden önce ağ işlemini tamamlamalı ve herhangi bir yanıtı kapatmalıdır. Aksi halde bağlantı hâlâ o proxy'yi kullanırken ödünç sona erer.

Queue.get kullanılabilir bir girdiyi atomik olarak kaldırır. Tükenmiş havuz, paylaşılan bayrakları tekrar tekrar taramak yerine bekler. Beş saniye içinde hiçbir girdi gelmezse queue.Empty çağırana ulaşır; bu sonuç için uygulamanın yeniden deneme, hata veya iptal politikasını seçin.

finally bloğu, başarıdan veya bir istisnadan sonra alınan girdiyi geri verir. Başarısız bir uç noktanın sağlıklı olduğunu bildirmez. Karantina, değiştirme ve soğutma politikaları, geçici bir hata gören her proxy'yi sessizce atmak yerine açık bir yol gerektirir.

Aynı URL dizelerinin yinelenenlerini kaldırmak, kuyrukta çift girdi oluşmasını önler. Farklı URL'ler yine de aynı fiziksel proxy'ye veya çıkışa işaret edebilir; özel olma durumu o paylaşılan kaynak için geçerli olacaksa bunları bilerek gruplayın. Kuyruk bu süreçteki iş parçacıklarını koordine eder, diğer makinelerdeki çalışanları değil.

İlgili makaleler