A pool map metódusa egyszerre egy elemet ad át a munkásnak. Tedd ezt az elemet teljes feladattá, beleértve az URL-t és a kiválasztott proxyt, hogy a munkás ne egy változó globális listából következtessen az útvonalára.

Véges számú urls esetén adj meg egy nem üres listát érvényesített proxy URL-ekből. Nyilvános HTTP-jelöltek a HTTP-proxy listán oldalon érhetők el:

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)

Az urls, proxy_urls és handle_result értékeket az alkalmazás biztosítja. A koordinátor ismétlődő sorrendben osztja ki a végpontokat; minden munkás egy rögzített párt kap. Az eredmények bejárása a munkások kivételeit is felszínre hozza.

Öt munkás az aktív feladatokat korlátozza, nem a proxynkénti aktív feladatokat. Ha a listán két végpont van, több feladat is használhatja ugyanazt a végpontot egyidejűleg. Ha szükséges, adj hozzá külön végpontonkénti kapacitásszabályt. Végpontonkénti URL-enként egy aktív feladathoz a szinkronizált sorlízing minden bejegyzést lefoglalhat és visszaadhat.

Az újrapróbálkozásnak új, korlátozott kísérletet kell létrehoznia ugyanahhoz az URL-hez. Kerüld azokat a rekurzív újrapróbálkozási hívásokat, amelyek bejegyzéseket távolítanak el egy megosztott listáról: lehet, hogy egy másik munkás éppen abból választ, és a kimerült listának továbbra is kifejezett eredményre van szüksége.

Kapcsolódó cikkek