python - Python 类变量作为缓存机制
问题描述
我的前同事创建了一些“管理器”类,它们是我们数据库中键值表的接口。例如,我们有一个ConfigurationManager,它映射到数据库中的配置表,该表保存带有键(即:“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 工作人员运行的,在生产中使用 Flask 实例。我们注意到,一段时间后,这些值无法再找到,尽管它们存在于数据库中。看起来我们的类变量缓存被清空了。
我怀疑的是:
- Python 垃圾收集这些类,从而在某些时候擦除类变量。但是,这并不能解释为什么 ConfigurationManager 不只是刷新数据库中的列表。
- 它与 Flask 和线程有关,其中使用了一些“加载”的对象,然后使用另一个空实例。然而,同样的事情在这里发生,该
_loaded
位应该指示需要加载数据,并且理论上它应该可以工作。
如果有人能阐明这种“缓存”方法是否有效,以及是什么导致变量在运行中丢失,我将不胜感激。
解决方案
推荐阅读
- cytoscape - 面板:网络概述
- python - 断言元素在 Selenium 中不可见
- c# - C# 中的自定义 ThreadPool 类实现
- javascript - 警告:使用了不正确的大小写。将 PascalCase 用于 React 组件
- php - 如何将 AJAX 功能添加到自定义 woocommerce 添加到购物车表单?
- excel - 为变体数组设计的 VB.NET Option Explicit 和 Office VSTO 方法
- python - FileNotFoundError: [Errno 2] No such file or directory: 'model.pkl' in python deploying webapp
- gradle - 在 JFrog Artifactory OSS 管理页面中看不到任何创建的 Gradle 存储库
- kubernetes - Kubernetes - 入口 v1
- java - 简单的 JAVA 摆动窗口中可调整大小的面板大小