map fondu odovzdáva pracovníkovi vždy jednu položku. Urobte z tejto položky úplnú úlohu vrátane URL a vybraného proxy, aby pracovník neodvodzoval svoju trasu z meniaceho sa globálneho zoznamu.

Pre konečné urls poskytnite neprázdny zoznam overených URL proxy. Verejní kandidáti HTTP sú dostupní v zozname HTTP proxy:

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 a handle_result dodáva aplikácia. Koordinátor priraďuje koncové body v opakujúcom sa poradí; každý pracovník dostane jeden pevný pár. Iterovanie výsledkov tiež odhalí výnimky pracovníkov.

Päť pracovníkov obmedzuje aktívne úlohy, nie aktívne úlohy na proxy. Ak má zoznam dva koncové body, niekoľko úloh môže používať ten istý koncový bod súčasne. V prípade potreby pridajte samostatné pravidlo kapacity pre každý koncový bod. Pre jednu aktívnu úlohu na URL koncového bodu môže synchronizovaný prenájom frontu rezervovať a vracať každú položku.

Opakovanie by malo vytvoriť nový obmedzený pokus pre rovnakú URL. Vyhnite sa rekurzívnym volaniam opakovania, ktoré odstraňujú položky zo zdieľaného zoznamu: iný pracovník z neho môže vyberať a vyčerpaný zoznam stále potrebuje výslovný výsledok.

Súvisiace články