Метад 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. Пазбягайце рэкурсіўных выклікаў паўтору, якія выдаляюць запісы з агульнага спіса: іншы працаўнік можа выбіраць з яго, а вычарпаны спіс усё яшчэ патрабуе яўнага выніку.

Падобныя артыкулы