Priraďte URL a proxy ku každej úlohe Python ThreadPoolExecutor
Priraďte proxy pred odoslaním úlohy požiadavky v Pythone namiesto toho, aby ste nechali pracovníkov súťažiť o zdieľaný meniteľný stav výberu.
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.