Рубрики
Без рубрики

Python Auto Refresh Cache

Их много сообщений в блоге, которые иллюстрируют кэширование в Python. Но я не мог найти, что это проиллюстрирует … Теги с Python, резьбой, кэш.

Их много сообщений в блоге, которые иллюстрируют кэширование в 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”