Ну-ка, еще разок
Nov 8, 2018 · CommentsPythonПрограммирование
Питоний пакет retrying - универсальная заплатка для кода, который может
поломаться из-за внешних причин. Например, socket.connect() может
закончится ошибкой из-за непредвиденной ситуации в сети. Заворачиваем вызов в
@retry и бац! Все работает.
@retry
def create_connection(address):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
return socket.connect(address)
Однако бездумное применение @retry, как нетрудно догадаться, приводит
проблемам. Самый известный пример - вложенные @retry.
@retry(stop_max_attempt_number=3) вложенный в другой
@retry(stop_max_attempt_number=3) дает 9 повторов. Три уровня вложенности -
27 повторов.
Один раз использование @retry привело к тому, что IT заблокировало мою учетную
запись. Банальная история - был некий скрипт, который при запуске спрашивал
логин и пароль для авторизации. В один прекрасный день некто (не будем
показывать пальцем, хотя это был Слонёнок) усовершенствовал скрип, завернув
сетевой вызов в @retry. Отличная идея, за исключением того, что ошибка
авторизации приводила к повторному запросу с тем же неправильным именем и
паролем. После определенного числа попыток контроллер домена решил, что кто-то
пытается подобрать пароль к учетной записи и заблокировал её.
Мораль истории - знайте свои ошибки в лицо и используйте параметр
retry_on_exception.