Round-Robin-Proxy-Auswahl in Python mit itertools.cycle
Nutze einen wiederholenden Iterator für eine vorhersagbare Proxy-Auswahl aus einem festen Pool und halte die Auswahl getrennt von der Anfrageausführung und der Gesundheit.
Für einen festen Pool kann die Round-Robin-Auswahl angenehm kurz sein:
from itertools import cycle
choices = cycle([
"http://proxy-a.example:8080",
"http://proxy-b.example:8080",
"http://proxy-c.example:8080",
])
endpoint = next(choices)
Ersetze die Beispiel-URLs durch HTTP-Endpunkte aus deinem Dienst oder aus der HTTP-Proxy-Liste. Aufeinanderfolgende Aufrufe liefern A, B, C und dann wieder A. Verwende den gewählten Wert beim Konfigurieren der folgenden Anfrage. Würdest du den Iterator für jede Anfrage neu erzeugen, beganne die Reihenfolge von vorn. Bei Requests übergib den gewählten Endpunkt an die Anfrage.
Wenn du eine Liste bevorzugst, verschiebe ihr erstes Element ans Ende. pool.append(pool.pop()) entfernt das letzte Element und legt es direkt zurück; das erste Element ändert sich nie. Die Warteschlangenoperation ist pool.append(pool.pop(0)), doch das Entfernen von vorn verschiebt die übrigen Listenelemente.
Der Iterator hat eine bewusst bescheidene Aufgabe. Er prüft nicht die Verfügbarkeit, entfernt keine fehlgeschlagenen Einträge und garantiert keinen anderen öffentlichen Ausgang. Mehrere Endpunkte können sich eine Außenadresse teilen.
Halte Wiederholungsrichtlinie und Pool-Aktualisierungen außerhalb dieses kleinen Selektors. Ein geteilter Iterator braucht außerdem ein bewusstes Eigentumsmodell in nebenläufigem Code, damit der gewählte Endpunkt an die Operation gebunden bleibt, die ihn erhalten hat.