首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python每隔一段定义的时间清除lru_cache

Python每隔一段定义的时间清除lru_cache
EN

Stack Overflow用户
提问于 2020-07-11 07:43:05
回答 2查看 270关注 0票数 0

我对一个应用程序接口进行了很多多余的调用,所以我决定使用lru_cache。但是,我也希望经常清除缓存,以防给定输入的响应值发生变化。因此,作为一种解决方案,我创建了自己的装饰器,以便每隔一段时间清除缓存,但现在我的函数api_call()似乎总是返回None。下面是我的代码:

代码语言:javascript
复制
def cache_maintainer(clear_time: int):
    """
    A function decorator that clears lru_cache clear_time seconds
    :param clear_time: In seconds, how often to clear cache (only checks when called)
    """
    def inner(func):
        def wrapper(*args, **kwargs):
            if hasattr(func, 'next_clear'):
                if time.time() > func.next_clear:
                    func.cache_clear()
                    func.next_clear = time.time() + clear_time
            else:
                func.next_clear = time.time() + clear_time

            func(*args, **kwargs)
        return wrapper
    return inner


@cache_maintainer(86400)  # clear cache every 1 day
@lru_cache(maxsize=1000)
def api_call(param):
    return param

print(api_call("test"))

我无论如何也找不出我做错了什么

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-11 07:48:50

这个答案是使用python包- cachetools

安装cachetools pip install cachetools

代码语言:javascript
复制
from cachetools import TTLCache

cache = TTLCache(maxsize=5, ttl=100)
cache['dog'] = 'dog'
a = cache['dog'] # dog
... after 100 seconds...
cache['dog']
KeyError exception thrown
票数 1
EN

Stack Overflow用户

发布于 2020-07-11 07:53:08

非常简单的错误,花了太长时间才弄清楚。正如Tim Peters提到的,func()被调用,但结果被丢弃(face palm)。我所需要做的就是在调用func()的地方添加一个返回值,它就像我所期望的那样工作。以下是修改后的正常工作代码:

代码语言:javascript
复制
def cache_maintainer(clear_time: int):
    """
    A function decorator that clears lru_cache clear_time seconds
    :param clear_time: In seconds, how often to clear cache (only checks when called)
    """
    def inner(func):
        def wrapper(*args, **kwargs):
            if hasattr(func, 'next_clear'):
                if time.time() > func.next_clear:
                    func.cache_clear()
                    func.next_clear = time.time() + clear_time
            else:
                func.next_clear = time.time() + clear_time

            return func(*args, **kwargs)
        return wrapper
    return inner


@cache_maintainer(86400)  # clear cache every 1 day
@lru_cache(maxsize=1000)
def api_call(param):
    return param

print(api_call("test"))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62843699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档