【问题标题】:Using functools lru_cache, how can I determine if the function returned me cached data?使用 functools lru_cache,如何确定函数是否返回了缓存数据?
【发布时间】:2019-03-18 21:19:13
【问题描述】:

我有一个简单的实现,它使用包装器 lru_cache 围绕从远程数据库获取数据的函数。我希望能够判断结果是否可能是“陈旧的”(即,它是从缓存中获取的还是从数据库中获取的)。我怎么知道呢?

代码很简单,只是:

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

【问题讨论】:

    标签: python lru


    【解决方案1】:

    仅在单线程程序中有效的糟糕解决方案可能是监视函数的cache_info 以查看统计信息是否发生变化:

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

    更好的解决方案可能是更多地考虑您认为陈旧 ...所有值最终都来自数据库...是什么让您在过去的函数调用中查询过时...自上次查询以来的时间,返回的行上的版本标记等

    【讨论】:

      【解决方案2】:

      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
      

      【讨论】:

        猜你喜欢
        • 2018-04-23
        • 2016-12-20
        • 2020-12-01
        • 2018-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多