Wie die Umsetzung retry-Mechanismus in python-requests-Bibliothek?
Ich möchte hinzufügen eines retry-Mechanismus für python-Anfrage-Bibliothek, sodass Skripts, die verwenden, es wird wiederholt für nicht schwerwiegende Fehler.
In diesem moment ich halte es Art von Fehler wiederhergestellt werden:
- HTTP-return-codes 502, 503, 504
- host nicht gefunden (weniger wichtig)
- request timeout
In der ersten Phase möchte ich wiederholen angegeben 5xx Anfragen pro minute.
Ich möchte in der Lage sein, um diese Funktionalität hinzufügen, transparent, ohne dass Sie manuell implementieren Erholung für jeden HTTP-Aufruf aus, in diese Skripts oder libraries, die mit python-requests.
dieser helfen?
das bezieht sich nur auf transport-Ebene-Fehler; socket-timeouts, SSL-Fehler, und das mag. Ein server return-code in das 500-Sortiment ist nicht abgedeckt.
Funktioniert die python-requests verarbeiten-status-code 429? tools.ietf.org/html/rfc6585 Leider, die meisten Webseiten senden unangemessen codes, wenn die rate begrenzt (wie die 503 und 404).
Anfragen enthält eine Kopie der urllib3 die Klasse Wiederholen (in Anfragen.- Pakete.util.wiederholen Sie den Vorgang.Wiederholen), die es erlauben, präzisere Steuerung, und umfasst ein backoff-Mechanismus zur Wiederholung. Für status-basierten wiederholen, verwenden Sie folgenden parameter: status_forcelist wird die Kraft von bestimmten status-code der Antwort wiederholt werden nach der Strategie, gewählt.
Ich bereits umgesetzt, was heißen würde, eine ResilientSession die Pflege übernimmt, dies in einer transparenten Art und Weise. Blick auf meine Umsetzung aus dem inneren JIRA Python-Bibliothek.
das bezieht sich nur auf transport-Ebene-Fehler; socket-timeouts, SSL-Fehler, und das mag. Ein server return-code in das 500-Sortiment ist nicht abgedeckt.
Funktioniert die python-requests verarbeiten-status-code 429? tools.ietf.org/html/rfc6585 Leider, die meisten Webseiten senden unangemessen codes, wenn die rate begrenzt (wie die 503 und 404).
Anfragen enthält eine Kopie der urllib3 die Klasse Wiederholen (in Anfragen.- Pakete.util.wiederholen Sie den Vorgang.Wiederholen), die es erlauben, präzisere Steuerung, und umfasst ein backoff-Mechanismus zur Wiederholung. Für status-basierten wiederholen, verwenden Sie folgenden parameter: status_forcelist wird die Kraft von bestimmten status-code der Antwort wiederholt werden nach der Strategie, gewählt.
Ich bereits umgesetzt, was heißen würde, eine ResilientSession die Pflege übernimmt, dies in einer transparenten Art und Weise. Blick auf meine Umsetzung aus dem inneren JIRA Python-Bibliothek.
InformationsquelleAutor sorin | 2014-04-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diesem code-snippet werden alle HTTP-Anfragen von der gleichen Sitzung wiederholen, insgesamt 5 mal schlafen zwischen den Wiederholungen mit steigendem backoff von 0s, 2s, 4s, 8s, 16s (die erste Wiederholung erfolgt sofort). Es wird wiederholt auf grundlegende Probleme mit der Konnektivität (einschließlich der DNS-lookup-Fehler) und HTTP-status-codes, 502, 503 und 504.
Sehen Klasse wiederholen für details.
ich Stimme @alex.veprik, aber ich bin voreingenommen! 😛
Der Retry-Klasse behandelt, die intern. Wenn alle Wiederholungsversuche fehl (oder Wiederholungen sind deaktiviert) es wirft urllib3.readthedocs.io/de/latest/Referenz/..., die Sie fangen können, wenn Sie möchten. Ich habe aktualisiert, der link zum Wiederholen der Klasse - schauen Sie dort für weitere details.
Ersten backoff ist 0s, 1s nicht gemäß der Dokumentation. So geht es wie bei 0s, 2s, 4s, 8s, 16s
es ist ein Muster zu legen, um den adapter. So in diesem Fall werden alle URLs, die mit beginnen
http://
verwenden, - adapter. Sie hätten einen speziellen adapter fürhttps://cnn.com
zum Beispiel. Alle Anrufe mit dieser Sitzung wird über die custom-HTTP-adapter beim Zugriff aufhttps://cnn.com
und die Vorgabe für alles andere.InformationsquelleAutor datashaman
Dies ist ein code-snippet, die ich verwendet, um zu wiederholen, die für die Petitionen gemacht, mit urllib2. Vielleicht könnten Sie es für Ihre Zwecke:
Die Wartezeit wächst inkrementell zu vermeiden, gebannt vom server.
InformationsquelleAutor Mikel Emaldi Manrique
War ich in der Lage, um den gewünschten Grad an Zuverlässigkeit durch die Erweiterung
requests.Session
Klasse.Hier ist der code https://bitbucket.org/bspeakmon/jira-python/src/a7fca855394402f58507ca4056de87ccdbd6a213/jira/resilientsession.py?at=master
BEARBEITEN, Der code war:
Hier ist eine grundlegende überarbeitung Ihrer belastbar-Sitzung für die Verwendung von Dekoratoren. Noch gibt es einige überschneidungen (die Methoden haben alle das gleiche Muster), aber es funktioniert genau das gleiche, und Sie müssen Sie nur ändern Sie die Logik an einer Stelle: gist.github.com/datashaman/fc02882d6be49d0b882f
Eine weitere prägnante version der Wiederholung auf die request-Methode, die Beseitigung aller Duplizierung von code: gist.github.com/datashaman/a517da0ebfe7939c6b83
InformationsquelleAutor sorin