Bir havuzun map'i, çalışana her seferinde bir öğe iletir. Bu öğeyi, URL ve seçilen proxy dahil olmak üzere eksiksiz bir iş haline getirin; böylece çalışan rotasını değişen küresel bir listeden çıkarsamaz.

Sonlu urls için doğrulanmış proxy URL'lerinden oluşan boş olmayan bir liste sağlayın. Genel HTTP adayları HTTP proxy listesinde sayfasında mevcuttur:

from concurrent.futures import ThreadPoolExecutor
from itertools import cycle
import requests

def fetch(job):
    url, proxy_url = job
    proxies = {"http": proxy_url, "https": proxy_url}
    with requests.get(url, proxies=proxies, timeout=(5, 15)) as response:
        response.raise_for_status()
        return url, response.text

if not proxy_urls:
    raise ValueError("No proxy endpoints were supplied")

jobs = zip(urls, cycle(proxy_urls))
with ThreadPoolExecutor(max_workers=5) as executor:
    for url, body in executor.map(fetch, jobs):
        handle_result(url, body)

urls, proxy_urls ve handle_result uygulama tarafından sağlanır. Koordinatör uç noktaları yinelenen bir sırayla atar; her çalışan sabit bir çift alır. Sonuçların yinelenmesi, çalışan istisnalarını da ortaya çıkarır.

Beş çalışan etkin işleri sınırlar, proxy başına etkin işleri değil. Listede iki uç nokta varsa, birkaç iş aynı uç noktayı aynı anda kullanabilir. Gerektiğinde her uç nokta için ayrı bir kapasite kuralı ekleyin. Her uç nokta URL'si için bir etkin iş için, bir eşzamanlı kuyruk kiralama her girişi rezerve edip geri verebilir.

Yeniden deneme, aynı URL için yeni ve sınırlı bir deneme oluşturmalıdır. Paylaşılan bir listeden girişleri kaldıran özyinelemeli yeniden deneme çağrılarından kaçının: başka bir çalışan oradan seçiyor olabilir ve tükenmiş bir liste yine de açık bir sonuç gerektirir.

İlgili makaleler