map на базенот му предава на работникот еден елемент по еден. Направете го тој елемент целосна работа, вклучувајќи го URL-то и избраното прокси, за работникот да не ја изведува својата рута од променлива глобална листа.

За конечен број urls, доставите непразна листа на валидирани прокси URL-а. Јавните HTTP кандидати се достапни во листата на HTTP прокси:

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 и handle_result ги обезбедува апликацијата. Координаторот доделува крајни точки во редослед што се повторува; секој работник добива еден фиксен пар. Повторувањето на резултатите исто така ги открива исклучоците на работниците.

Пет работници ограничуваат активни работи, а не активни работи по прокси. Ако листата има две крајни точки, неколку работи можат истовремено да ја користат истата крајна точка. Додајте посебно правило за капацитет по крајна точка кога е потребно. За една активна работа по URL на крајна точка, синхронизиран закуп на ред може да резервира и врати секој запис.

Повторниот обид треба да создаде нов ограничен обид за истиот URL. Избегнувајте рекурзивни повици за повторен обид што отстрануваат записи од споделена листа: друг работник можеби избира од неа, а исцрпената листа сè уште бара јасен исход.

Поврзани статии