Пулдың 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 үшін жаңа шектелген әрекет жасауы керек. Ортақ тізімнен жазбаларды жоятын рекурсивті қайта әрекет шақыруларынан аулақ болыңыз: басқа жұмысшы одан таңдап жатқан болуы мүмкін, ал сарқылған тізім әлі де нақты нәтижені қажет етеді.

Қатысты мақалалар