Alternativen zu retrying
: tenacity
y backoff
(Aktualisierung 2020)
En erneuter Versuch Bibliothek war früher die beste Lösung, aber leider hat sie einige Bugs und wurde seit 2016 nicht mehr aktualisiert. Andere Alternativen scheinen zu sein Backoff y Ausdauer . Zum Zeitpunkt des Verfassens dieses Artikels hatte die Tenacity mehr GItHub-Sterne (2,3k gegenüber 1,2k) und wurde vor kurzem aktualisiert, daher habe ich mich für sie entschieden. Hier ist ein Beispiel:
from functools import partial
import random # producing random errors for this example
from tenacity import retry, stop_after_delay, wait_fixed, retry_if_exception_type
# Custom error type for this example
class CommunicationError(Exception):
pass
# Define shorthand decorator for the used settings.
retry_on_communication_error = partial(
retry,
stop=stop_after_delay(10), # max. 10 seconds wait.
wait=wait_fixed(0.4), # wait 400ms
retry=retry_if_exception_type(CommunicationError),
)()
@retry_on_communication_error
def do_something_unreliable(i):
if random.randint(1, 5) == 3:
print('Run#', i, 'Error occured. Retrying.')
raise CommunicationError()
for i in range(100):
do_something_unreliable(i)
Der obige Code gibt etwa Folgendes aus:
Run# 3 Error occured. Retrying.
Run# 5 Error occured. Retrying.
Run# 6 Error occured. Retrying.
Run# 6 Error occured. Retrying.
Run# 10 Error occured. Retrying.
.
.
.
Weitere Einstellungen für das tenacity.retry
sind auf der Website tenacity GitHub-Seite .