@Lepilov

Как работает кэширующий декоратор lru_cash?

Есть некая логика описанная в модуле. В нем несколько раз в разных функциях происходит вызов стороннего апи. Такой вызов был закеширован с помощью lru_cash. Получается что теперь вызов апи происходит один раз, а дальнейшие последовательные вызовы функции обращения к апи на самом деле возвращают закешированный результат. Мне не понятно как долго этот результат будет закешированным. Это происходит только в рамках исполнения интерпритатором питона модуля с вызовом API? Т.е. упрощая , если по нажатию кнопки на фронте происходит вызов модуля и обращение к API и выводится результат. В этот момент данные в API обновились. Теперь опять делаем вызов и уже новые данные будут закешированы?
  • Вопрос задан
  • 91 просмотр
Пригласить эксперта
Ответы на вопрос 1
@Lepilov Автор вопроса
Возможно кому то будет полезным, lru_cash можно немного модернизировать и он будет работать отчищать кэш по временному интервалу

def timed_lru_cache(seconds: int, maxsize: int = 128) -> Callable:
    def wrapper_cache(func):
        func = lru_cache(maxsize=maxsize)(func)
        func.lifetime = timedelta(seconds=seconds)
        func.expiration = datetime.utcnow() + func.lifetime

        @wraps(func)
        def wrapped_func(*args, **kwargs):
            if datetime.utcnow() >= func.expiration:
                func.cache_clear()
                func.expiration = datetime.utcnow() + func.lifetime
            return func(*args, **kwargs)
        return wrapped_func
    return wrapper_cache
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы