Альтернативи retrying
: tenacity
та backoff
(оновлення до 2020 року)
Повторна спроба бібліотека була раніше шлях, але , до жаль , у нього є якась - то помилка і він не отримав будь - яких оновлень , так як 2016 Інших альтернатив , як представляються, з втратою потужності і міцності на розрив . Під час написання цього запиту, впертість мала більше зірок GItHub (2.3k проти 1.2k) і оновлювалася останнім часом, тому я вирішив використовувати його. Ось приклад:
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()
Вищевказаний код видає щось на кшталт:
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.
.
.
.
Більше налаштувань для tenacity.retry
перелічених наведено на сторінці GitHub із завзятістю .
range(100)
без першого параметра. Якщо ви використовуєте Python 2.x, ви навіть можете використовуватиxrange(100)
, це генерує ітератор і використовує менше пам'яті. (Не те, що це стосується лише 100 об’єктів.)