Используя functools lru_cache, как я могу определить, вернула ли функция мне кэшированные данные? - PullRequest
0 голосов
/ 19 марта 2019

У меня есть простая реализация, использующая оболочку lru_cache вокруг функции, которая извлекает данные из удаленной базы данных.Я хочу быть в состоянии сказать, если результат может быть "устаревшим" (то есть, он был извлечен из кэша против базы данных).Как я могу это выяснить?

Код прост, просто:

@lru_cache(maxsize=2048)
def fetch_cached_data(query, *args, **kwargs):
    return fetch_data(query, *args, **kwargs)

Ответы [ 2 ]

1 голос
/ 05 мая 2019

Решение с ring, действительное только в однопоточной программе.

import ring

@ring.lru(maxsize=2048)
def fetch_cached_data(query, *args, **kwargs):
    return query

if __name__ == '__main__':
    is_cached = fetch_cached_data.has('query')
    data = fetch_cached_data('query')
    print(is_cached, data)

    is_cached = fetch_cached_data.has('query')
    data = fetch_cached_data('query')
    print(is_cached, data)

Тогда вывод:

False query
True query
1 голос
/ 19 марта 2019

Плохое решение, действительное только в однопоточной программе, может заключаться в мониторинге cache_info функции, чтобы увидеть, меняется ли статистика:

hits = f.cache_info().hits
result = f(some_arg)
if f.cache_info().hits > hits:
    # this result was retrieved from cache
    ...

Лучшим решением может быть больше думать о том, что вы считаете устаревшим ... все значения в конечном итоге поступили из базы данных ... что делает то, что вы запрашивали в прошлом вызове функции, устаревшим. ... время, прошедшее с момента последнего запроса, возвращенная отметка о версии в строках и т. д.

...