2.8. @aiomisc.asyncbackoff#
``asyncbackoff `` декоратор который обеспечивает политику повторов и политику максимального количества повторных попыток выполнения асинхронной функции.
Основной принцип может быть описан пятью правилами:
функция будет отменена, если она будет выполнена дольше, чем
deadline(если указано)функция будет отменена при выполнении дольше, чем ``attempt_timeout` (если указано) после этого будет выполнена повторная попытка.
Попытки выполняются после
pauseсекунд (если указано, по умолчанию0)Попытки будут выполняться не более
max_triesраз.аргумент
giveup- это функция, которая решает, следует ли «сдаться» и прекратить дальнейшие попыток или продолжать.
Все эти правила работают одновременно.
Описание аргументов:
attempt_timeoutмаксимально допустимое время выполнения одной попытки.deadlineмаксимально допустимое время выполнения всех попыток.pauseпромежуток времени между попытками.exceptionsделает последующие попытки только если эти будут брошены эти исключения.giveup(именовынный аргумент) это функция-предикат, которая может решить по данному исключению, следует ли нам продолжать повторять попытки.max_tries(именовынный аргумент) - максимальное количество попыток (> = 1).
Декоратор, обеспечивающий соблюдение временных ограничений «attempt_timeout» и «deadline» декорированной функцией.
В случае возникновения исключения функция будет вызвана снова с аналогичными аргументами через кол-во секунд переданное в аргументе «pause».
Объявление через позиционные аргументы:
import aiomisc
attempt_timeout = 0.1
deadline = 1
pause = 0.1
@aiomisc.asyncbackoff(attempt_timeout, deadline, pause)
async def db_fetch():
...
@aiomisc.asyncbackoff(0.1, 1, 0.1)
async def db_save(data: dict):
...
# Передаем список исключений
@aiomisc.asyncbackoff(0.1, 1, 0.1, TypeError, RuntimeError, ValueError)
async def db_fetch(data: dict):
...
Объявление через именованные аргументы
import aiomisc
attempt_timeout = 0.1
deadline = 1
pause = 0.1
@aiomisc.asyncbackoff(attempt_timeout=attempt_timeout,
deadline=deadline, pause=pause)
async def db_fetch():
...
@aiomisc.asyncbackoff(attempt_timeout=0.1, deadline=1, pause=0.1)
async def db_save(data: dict):
...
# Передаем список исключений
@aiomisc.asyncbackoff(attempt_timeout=0.1, deadline=1, pause=0.1,
exceptions=[TypeError, RuntimeError, ValueError])
async def db_fetch(data: dict):
...
# Будет повторено не больше чем 2 раза (всего 3 попытки)
@aiomisc.asyncbackoff(attempt_timeout=0.5, deadline=1,
pause=0.1, max_tries=3,
exceptions=[TypeError, RuntimeError, ValueError])
async def db_fetch(data: dict):
...
# Повторы будут только если соединение было сброшено (только POSIX системы)
@asyncbackoff(attempt_timeout=0.5, deadline=1, pause=0.1,
exceptions=[OSError],
giveup=lambda e: e.errno != errno.ECONNABORTED)
async def db_fetch(data: dict):
...
2.9. asyncretry#
Аналог asyncbackoff(None, None, 0, *args, **kwargs). Прсто повторяет выполнение функции max_tries раз.
Примечание
По умолчанию будет повторена попытка при любом исключении. Это очень просто и полезно в общих случаях, при этом следует указать список исключений тогда, когда обернутые функции вызывают сотни раз в секунду, потому что у вас есть риск быть причиной отказа в обслуживании в случае, если ваша функция вызывает какой-то сервис по сети.
from aiomisc import asyncretry
@asyncretry(5)
async def try_download_file(url):
...
@asyncretry(3, exceptions=(ConnectionError,))
async def get_cluster_lock():
...