Их много сообщений в блоге, которые иллюстрируют кэширование в Python. Но я не мог найти, что иллюстрирует мою простую идею. Я искал модуль или пост о том, как держать свой кеш обновлять каждый раз, когда я запрашиваю один и тот же ключ, который я хотел, чтобы резьбовый кеш немедленно отвечаю на мой запрос, но после этого обновить значение, поэтому мои данные будут всегда свежие. Я знаю, что вы можете достичь этого с установкой небольшого значения TTL Но мое намерение состоит в том, чтобы получить текущие данные о кеше и до следующего запроса кэш будет обновляться в отдельном потоке. Я делаю это, сочетая кэширование с многопоточными функциями Python.
Достаточно разговоров, давайте сделаем кодирование
import functools import random import threading import time from threading import Thread from typing import Match my_cache = {} def cach_it(_func=None, *, as_daemon=False): def decorator_cache_it(func): @functools.wraps(func) def wrapper_cach_it(*args, **kwargs): key = (func.__name__, args, hash(tuple(sorted(kwargs)))) if key in my_cache: result = my_cache[key] def threaded_func(): my_cache[key] = func(*args, **kwargs) t = threading.Thread(target=threaded_func, daemon=as_daemon) t.start() else: result = func(*args, **kwargs) my_cache[key] = result return result return wrapper_cach_it if _func is None: return decorator_cache_it else: return decorator_cache_it(_func) @cach_it(as_daemon=True) def sample_func(a, b): time.sleep(2) return (a + b) * random.random() if __name__ == "__main__": for i in range(10): print(sample_func(5, 5)) time.sleep(1)
а также выход
9.57128226715124 9.57128226715124 9.57128226715124 2.886742714779955 3.8942583934686836 6.492309167842186 6.492309167842186 0.3771087685702834 6.994070882085098 9.45145128039504
Идея проста. Я использую простую метод кэширования словаря Python для простоты. Если ключ не найден в словаре, перейдите и выполните функцию после этого кэш результатом в словаре, если ключ уже существует, то вернуть результат из словаря и обновить словарь в фоновой резьбе, поэтому в следующий раз я получу Свежие данные.
От вывода вы можете заметить, что тот же результат возвращен до тех пор, пока кеш не будет обновляться из потока.
Функции сна используются для моделирования операций, которые требуют времени.
Я надеюсь, что вы можете использовать этот метод для лучшего кэширования на ваших проектах.
Ваш отзыв очень важен .
Оригинал: “https://dev.to/balighmehrez/python-auto-refresh-cache-50d1”