К сожалению, реализация пользовательского декоратора retry
часто может быть немного затруднительной. Если вы хотите настроить их логику или отрегулировать их, на самом деле это может довольно быстро стать довольно сложным. Существует библиотека Python под названием Backoff-Utils, которая поддерживает очень надежные и легко расширяемые стратегии повтора / отката (полное раскрытие: я предвзято, поскольку я являюсь автором этой библиотеки).
В своем гипотетическом вопросе вы можете использовать библиотеку в стратегии на основе декоратора:
from backoff_utils import backoff, apply_backoff, strategies
@apply_backoff(strategies.Fixed, max_tries = 3, catch_exceptions = [type(ValueError)])
def main2():
# np.load('File2.csv')
raise ValueError
print("In main2")
или вы можете использовать его в стратегии, основанной на функциях, при вызове main2()
:
result = backoff(main2,
max_tries = 3,
catch_exceptions = [type(ValueError)],
strategy = strategies.Fixed)
Конечно, приведенный выше фрагмент кода специально разработан для выполнения именно того, что вы описали выше. Он использует линейную стратегию (просто повторная попытка 3 раза с задержкой по умолчанию в 1 секунду между попытками).
Используя библиотеку, вы можете использовать любое количество других стратегий повтора / задержки, включая экспоненциальный откат, Фибоннаци, линейную прогрессию и полиномиальную. Вы также можете настроить и создать свои собственные стратегии задержки. И вы можете включить собственные обработчики успеха / неудачи и различные альтернативные пути для разных типов ситуаций.
Конечно, вся эта гибкость избыточна для вашего конкретного случая использования - вам не нужно так много. Но это может быть проще, чем беспокоиться о копировании / вставке / обслуживании собственного декоратора повтора, и он дает вам дополнительные встроенные параметры, если вы обнаружите, что в будущем вам понадобятся более сложные стратегии повтора.
Если это будет полезно, вы можете найти довольно подробную документацию здесь: https://backoff-utils.readthedocs.io/en/latest/index.html
Надеюсь это поможет!
person
Chris Modzelewski
schedule
11.07.2020