Wijs een URL en proxy toe aan elke Python ThreadPoolExecutor-taak
Wijs een proxy toe voordat je een Python-verzoektaak indient, in plaats van workers te laten strijden om gedeelde, veranderlijke selectiestatus.
De map van een pool geeft de worker één item per keer. Maak dat item een volledige taak, inclusief de URL en de gekozen proxy, zodat de worker zijn route niet afleidt uit een veranderende globale lijst.
Voor een eindig aantal urls geef je een niet-lege lijst met gevalideerde proxy-URL's op. Openbare HTTP-kandidaten zijn beschikbaar in de HTTP-proxylijst:
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 en handle_result worden door de applicatie geleverd. De coördinator wijst eindpunten toe in een herhalende volgorde; elke worker ontvangt één vast paar. Het itereren van de resultaten brengt ook worker-uitzonderingen aan het licht.
Vijf workers beperken actieve taken, niet actieve taken per proxy. Als de lijst twee eindpunten heeft, kunnen meerdere taken tegelijk hetzelfde eindpunt gebruiken. Voeg indien nodig een aparte capaciteitsregel per eindpunt toe. Voor één actieve taak per eindpunt-URL kan een gesynchroniseerde wachtrij-lease elk item reserveren en teruggeven.
Een nieuwe poging moet een nieuwe begrensde poging voor dezelfde URL maken. Vermijd recursieve nieuwe-poging-aanroepen die items uit een gedeelde lijst verwijderen: een andere worker selecteert er misschien uit, en een uitgeputte lijst heeft nog steeds een expliciete uitkomst nodig.