Ավազանի map-ը մեկ անգամ մեկ տարր է փոխանցում աշխատողին: Այդ տարրը դարձրեք ամբողջական աշխատանք՝ ներառյալ URL-ը և ընտրված proxy-ն, որպեսզի աշխատողը չենթադրի իր ուղին փոփոխվող գլոբալ ցանկից:

Վերջավոր urls-ի համար տրամադրեք վավերացված proxy URL-ների ոչ դատարկ ցանկ: Հանրային HTTP թեկնածուները հասանելի են 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-ը և handle_result-ը տրամադրվում են հավելվածի կողմից: Համակարգողը վերջնակետերը նշանակում է կրկնվող հերթականությամբ. յուրաքանչյուր աշխատող ստանում է մեկ ֆիքսված զույգ: Արդյունքների կրկնումը նաև բացահայտում է աշխատողների բացառությունները:

Հինգ աշխատող սահմանափակում են ակտիվ աշխատանքները, ոչ թե յուրաքանչյուր proxy-ի ակտիվ աշխատանքները: Եթե ցանկում երկու վերջնակետ կա, մի քանի աշխատանք կարող են միաժամանակ օգտագործել նույն վերջնակետը: Անհրաժեշտության դեպքում ավելացրեք առանձին հզորության կանոն յուրաքանչյուր վերջնակետի համար: Յուրաքանչյուր վերջնակետի URL-ի համար մեկ ակտիվ աշխատանքի դեպքում համաժամեցված հերթի վարձույթ-ը կարող է ամրագրել և վերադարձնել յուրաքանչյուր գրառում:

Կրկնվող փորձը պետք է ստեղծի նոր սահմանափակ փորձ նույն URL-ի համար: Խուսափեք ռեկուրսիվ կրկնվող փորձի կանչերից, որոնք գրառումներ են հեռացնում ընդհանուր ցանկից. մեկ այլ աշխատող կարող է դրանից ընտրել, և սպառված ցանկը դեռ պահանջում է հստակ արդյունք:

Առնչվող հոդվածներ