Python类变量作为缓存机制

时间:2019-01-24 15:58:07

标签: python flask

我的前同事创建了一些“经理”类,它们是数据库中键值表的接口。例如,我们有一个 ConfigurationManager ,它映射到数据库中的Configuration表,该表保存具有键(即:“ mailserver”)和值(即:“ 127.0.0.1”)的配置值。

此表可能包含几百个键值项,我们偶尔会从我们的代码中查找其中之一。

为防止每次我们需要配置表中的值时都需要执行查询,他实现了一种方法来“缓存”类列表中的所有值,因此它保留了这些值在类变量中列出。

如果_loaded变量是True,则他从数据库中加载列表,否则,他从类变量中返回它,如下所示:

class ConfigurationManager(object):
    """
    Provides configuration option values
    """

    _all_values = []
    _loaded = False

    @staticmethod
    def value(name):
        if not ConfigurationManager._loaded:
            ConfigurationManager.load_database()

        config = [x for x in ConfigurationManager._all_values if x.conf_name.lower() == name.lower()]
        if len(config) > 0:
            option = config[0]
            return option.conf_value
        else: 
            logger.debug('Configuration value {0} is empty or does not exist.'.format(name))
            return None

    @staticmethod
    def load_database():
        """
        Load configuration options from database
        """
        from flask import current_app
        ConfigurationManager._all_values = Configuration.query.all()
        for confval in ConfigurationManager._all_values:
            current_app.db_session.expunge(confval)
        ConfigurationManager._loaded = True

现在,我必须补充一点,他最初是C#开发人员,这可能是C#中的标准做法。但是,我从未在Python中看到过这样的例子。

实际的问题是,当我在单元测试中对此进行测试时,这似乎可行,但是代码是由Huey Task worker使用生产中的Flask实例运行的。 我们注意到的是,经过一段时间后,尽管它们存在于数据库中,但再也找不到这些值了。 看来我们的类变量缓存已清空。

我怀疑是:

  • Python会垃圾收集这些类,从而删除 类变量在某个时候。但是,这并不能解释为什么 ConfigurationManager不仅从数据库刷新列表。
  • 它与Flask和线程有关,其中一些对象是 被“加载”,然后在另一个实例上被使用 空的。但是,同样的事情在这里,_loaded位应该 表明需要加载数据,并且理论上应该 工作。

如果任何人都可以了解这种“缓存”方法是否有效,以及导致变量在操作中丢失的原因,我将不胜感激。

0 个答案:

没有答案