map bazena predaje radniku jednu stavku odjednom. Učinite tu stavku potpunim poslom, uključujući URL i odabrani proxy, kako radnik ne bi zaključivao svoju rutu iz promjenjive globalne liste.

Za konačan broj urls, dostavite nepraznu listu provjerenih proxy URL-ova. Javni HTTP kandidati dostupni su u listi HTTP proxyja:

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 i handle_result dostavlja aplikacija. Koordinator dodjeljuje krajnje točke u ponavljajućem redu; svaki radnik dobija jedan fiksni par. Ponavljanje rezultata također otkriva izuzetke radnika.

Pet radnika ograničava aktivne poslove, a ne aktivne poslove po proxyju. Ako lista ima dvije krajnje točke, nekoliko poslova može istovremeno koristiti istu krajnju točku. Dodajte zasebno pravilo kapaciteta po krajnjoj točki kada je to potrebno. Za jedan aktivni posao po URL-u krajnje točke, sinkronizirani najam reda može rezervisati i vratiti svaki unos.

Ponovni pokušaj treba stvoriti novi ograničeni pokušaj za isti URL. Izbjegavajte rekurzivne pozive ponovnog pokušaja koji uklanjaju unose iz zajedničke liste: drugi radnik možda bira iz nje, a iscrpljena lista i dalje zahtijeva jasan ishod.

Povezani članci