Alternativas a retrying
: tenacity
ybackoff
(actualización 2020)
La biblioteca de reintentos era el camino a seguir anteriormente, pero lamentablemente tiene algunos errores y no ha recibido ninguna actualización desde 2016. Otras alternativas parecen ser retroceso y tenacidad . Durante el momento de escribir esto, la tenacidad tenía más estrellas GItHub (2.3k vs 1.2k) y se actualizó más recientemente, por lo tanto, elegí usarla. Aquí hay un ejemplo:
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()
El código anterior genera algo como:
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.
.
.
.
Más configuraciones para el tenacity.retry
se enumeran en la página de tenacidad de GitHub .
range(100)
sin el primer parámetro. Si usa Python 2.x, incluso podría usarloxrange(100)
, esto genera un iterador y usa menos memoria. (No es que importe solo con 100 objetos).