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():
...