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 promjenjivog globalnog popisa.

Za konačan broj urls, dostavite neprazan popis provjerenih proxy URL-ova. Javni HTTP kandidati dostupni su na popisu 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 dobiva jedan fiksni par. Ponavljanje rezultata također otkriva iznimke radnika.

Pet radnika ograničava aktivne poslove, a ne aktivne poslove po proxyju. Ako popis ima dvije krajnje točke, nekoliko poslova može istodobno 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 čekanja može rezervirati i vratiti svaki unos.

Ponovni pokušaj trebao bi stvoriti novi ograničeni pokušaj za isti URL. Izbjegavajte rekurzivne pozive ponovnog pokušaja koji uklanjaju unose iz zajedničkog popisa: drugi radnik možda odabire iz njega, a iscrpljeni popis i dalje zahtijeva jasan ishod.

Povezani članci