Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用functools lru_cache,如何确定函数是否返回缓存数据?_Python_Lru - Fatal编程技术网

Python 使用functools lru_cache,如何确定函数是否返回缓存数据?

Python 使用functools lru_cache,如何确定函数是否返回缓存数据?,python,lru,Python,Lru,我有一个简单的实现,在从远程数据库获取数据的函数周围使用包装器lru_缓存。我想知道结果是否“过时”(即,它是从缓存中获取的,而不是从数据库中获取的)。我怎么知道呢 代码很简单,只是: @lru_cache(maxsize=2048) def fetch_cached_data(query, *args, **kwargs): return fetch_data(query, *args, **kwargs) 一个糟糕的解决方案(仅在单线程程序中有效)可能是监视函数的缓存\u info

我有一个简单的实现,在从远程数据库获取数据的函数周围使用包装器lru_缓存。我想知道结果是否“过时”(即,它是从缓存中获取的,而不是从数据库中获取的)。我怎么知道呢

代码很简单,只是:

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

一个糟糕的解决方案(仅在单线程程序中有效)可能是监视函数的
缓存\u info
,以查看统计信息是否在更改:

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

一个更好的解决办法可能是更多地考虑你认为过时的东西…所有的值最终都来自数据库。。。是什么使您在过去的函数调用中查询的函数过时。。。自上次查询以来,行上的版本戳返回etc

带有
环的解决方案,仅在单线程程序中有效

导入环
@环形lru(最大尺寸=2048)
def fetch_缓存_数据(查询、*args、**kwargs):
返回查询
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
is\u cached=fetch\u cached\u data.has('query'))
数据=获取缓存的数据(“查询”)
打印(是否缓存数据)
is\u cached=fetch\u cached\u data.has('query'))
数据=获取缓存的数据(“查询”)
打印(是否缓存数据)
那么输出是:

False query
True query