Για ένα σταθερό pool, η επιλογή round-robin μπορεί να είναι ευχάριστα μικρή:

from itertools import cycle

choices = cycle([
    "http://proxy-a.example:8080",
    "http://proxy-b.example:8080",
    "http://proxy-c.example:8080",
])

endpoint = next(choices)

Αντικαταστήστε τα δείγματα URL με HTTP endpoints από την υπηρεσία σας ή από τη λίστα HTTP proxy. Οι διαδοχικές κλήσεις επιστρέφουν A, B, C και μετά ξανά A. Χρησιμοποιήστε την επιλεγμένη τιμή κατά τη διαμόρφωση του επόμενου αιτήματος. Αν δημιουργείτε ξανά τον iterator για κάθε αίτημα, η ακολουθία θα ξεκινά από την αρχή. Για το Requests, περάστε το επιλεγμένο endpoint στο αίτημα.

Αν προτιμάτε λίστα, μετακινήστε το πρώτο της στοιχείο στο τέλος. Το pool.append(pool.pop()) αφαιρεί το τελευταίο στοιχείο και το επαναφέρει αμέσως· το πρώτο στοιχείο δεν αλλάζει ποτέ. Η πράξη ουράς είναι το pool.append(pool.pop(0)), ωστόσο η αφαίρεση από μπροστά μετατοπίζει τα υπόλοιπα στοιχεία της λίστας.

Ο iterator έχει σκόπιμα ταπεινή δουλειά. Δεν ελέγχει διαθεσιμότητα, δεν αφαιρεί αποτυχημένες εγγραφές και δεν εγγυάται διαφορετική δημόσια έξοδο. Πολλά endpoints μπορούν να μοιράζονται μία εξωτερική διεύθυνση.

Κρατήστε την πολιτική επαναλήψεων και τις ενημερώσεις του pool έξω από αυτόν τον μικρό επιλογέα. Ένας κοινόχρηστος iterator χρειάζεται επίσης ένα σκόπιμο μοντέλο ιδιοκτησίας σε ταυτόχρονο κώδικα, ώστε το επιλεγμένο endpoint να μένει συνδεδεμένο με τη λειτουργία που το έλαβε.

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