Το map μιας δεξαμενής περνά ένα στοιχείο στον εργάτη τη φορά. Κάντε αυτό το στοιχείο πλήρη εργασία, μαζί με το URL και το επιλεγμένο proxy, ώστε ο εργάτης να μην συνάγει τη διαδρομή του από μια μεταβαλλόμενη καθολική λίστα.

Για πεπερασμένα urls, δώστε μια μη κενή λίστα επικυρωμένων URL proxy. Δημόσιοι υποψήφιοι HTTP είναι διαθέσιμοι στη λίστα proxy 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 παρέχονται από την εφαρμογή. Ο συντονιστής αναθέτει τελικά σημεία με επαναλαμβανόμενη σειρά· κάθε εργάτης λαμβάνει ένα σταθερό ζεύγος. Η επανάληψη των αποτελεσμάτων αποκαλύπτει επίσης εξαιρέσεις εργατών.

Πέντε εργάτες περιορίζουν τις ενεργές εργασίες, όχι τις ενεργές εργασίες ανά proxy. Αν η λίστα έχει δύο τελικά σημεία, πολλές εργασίες μπορούν να χρησιμοποιούν το ίδιο τελικό σημείο ταυτόχρονα. Προσθέστε ξεχωριστό κανόνα χωρητικότητας ανά τελικό σημείο όταν απαιτείται. Για μία ενεργή εργασία ανά URL τελικού σημείου, μια συγχρονισμένη μίσθωση ουράς μπορεί να δεσμεύει και να επιστρέφει κάθε καταχώριση.

Μια επανάληψη θα πρέπει να δημιουργεί μια νέα περιορισμένη προσπάθεια για το ίδιο URL. Αποφύγετε αναδρομικές κλήσεις επανάληψης που αφαιρούν καταχωρίσεις από κοινόχρηστη λίστα: ένας άλλος εργάτης μπορεί να επιλέγει από αυτήν, και μια εξαντλημένη λίστα χρειάζεται ακόμη ένα ρητό αποτέλεσμα.

Σχετικά άρθρα