с янв
Часто спрашивают в личку, поэтому выкладываю кусок, который таскаю из прогона в прогон. Никаких пакетов, только стандартная библиотека.
import random, time, functools
def povtory(popytok=5, baza=0.5, potolok=60, lovim=(OSError,)): def obertka(fn): @functools.wraps(fn) def vnutri(*a, **kw): for n in range(popytok): try: return fn(*a, **kw) except lovim: if n == popytok - 1: raise pauza = min(baza * 2 ** n, potolok) time.sleep(random.uniform(0, pauza)) return vnutri return obertka
@povtory(popytok=6, lovim=(OSError, TimeoutError)) def skachat(url): ... ```
Три вещи тут важнее самой формулы.
Спим случайное время от нуля до расчётной паузы. Полный разброс размазывает пробуждения куда лучше, чем добавка плюс-минус десять процентов вокруг ровного значения.
Последняя попытка не спит, она сразу пробрасывает ошибку наверх. Иначе прогон честно отдыхает минуту перед тем, как всё равно упасть.
Ловим только перечисленное. Ошибку разбора повторять бессмысленно, разметка сама себя за пять секунд не починит.