map laugarinnar sendir vinnsluþræðinum eitt atriði í einu. Gerðu það atriði að heildu verki, þar á meðal vefslóðina og valda proxy, svo vinnsluþráðurinn álykti ekki leið sína af breytilegum alheimslista.

Fyrir endanleg urls skaltu gefa upp ekki tóman lista af staðfestum proxy-vefslóðum. Opinber HTTP-frambjóðendur eru fáanlegir í HTTP proxy listanum:

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 og handle_result eru veitt af forritinu. Samræmandinn úthlutar endapunktum í endurtekinni röð; hver vinnsluþráður fær eitt fast par. Endurtekning á niðurstöðunum kemur einnig í ljós undantekningum vinnsluþráða.

Fimm vinnsluþræðir takmarka virk verk, ekki virk verk á hvert proxy. Ef listinn hefur tvo endapunkta geta nokkur verk notað sama endapunkinn samtímis. Bættu við sérstakri afkastareglu fyrir hvern endapunkt þegar þörf krefur. Fyrir eitt virkt verk á hverja endapunktavefslóð getur samstillt biðröðarleiga áskilið og skilað hverri færslu.

Endurtekin tilraun ætti að búa til nýja takmarkaða tilraun fyrir sömu vefslóð. Forðastu endurkvæm endurtökuköll sem fjarlægja færslur úr sameiginlegum lista: annar vinnsluþráður gæti verið að velja úr honum, og upptækur listi þarf samt skýra niðurstöðu.

Tengdir greinar