Alternativas para retrying
: tenacity
e backoff
(atualização de 2020)
A tentar novamente biblioteca era anteriormente o caminho a percorrer, mas infelizmente tem alguns bugs e não tem nenhuma atualização desde 2016. Outras alternativas parecem ser de recuo e tenacidade . Durante o tempo em que escrevi isso, a tenacidade tinha mais estrelas no GItHub (2,3k vs 1,2k) e foi atualizada mais recentemente, portanto, escolhi usá-lo. Aqui está um exemplo:
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()
O código acima gera 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.
.
.
.
Mais configurações para o tenacity.retry
estão listadas na página de tenacidade do GitHub .
range(100)
sem o primeiro parâmetro. Se você usa o Python 2.x, pode até usarxrange(100)
, isso gera um iterador e usa menos memória. (Não que isso importe com apenas 100 objetos.)