我有一个pickle文件,其中包含已编译的正则表达式和其他数据的列表。
加载大约需要1-1.5秒。
将这个列表用于我的视图有什么好办法,但只对文件进行一次修补?
会导入settings.py被认为是好吗?
有什么想法吗?
答案 0 :(得分:2)
我会编写一个python模块 - 一个带有init方法的单例类,它将pickle数据读入python对象,然后是获取信息所需的“get”方法。
然后在您的settings.py中,您只需调用初始化方法。任何需要从中获取信息的东西只需导入模块并使用get方法。
答案 1 :(得分:2)
创建一个名为cache.py的模块,然后:
import cache
data = getattr(cache, 'data', '') or get_my_data()
这将仅通过服务器进程重新加载数据一次(这取决于您的设置,您的Web服务器以及您使用WSGI或CGI的任何位置)。在开发Web服务器(./manage.py runserver
)中,每次修改文件时,缓存都将失效。
Python中的模块仅为每个Python进程导入一次。如果多次使用import
,它将仅返回对已导入模块的引用。因此,如果你有一个运行带有4个worker的mod_wsgi的Apache,get_my_data()
只会被调用4次,因为只有4个Python进程在运行。请记住,工人可能会死亡,被重新加载,被杀等等。但它应该将get_my_data()
的呼叫保持在最低限度。
问题:如果一个进程修改了缓存数据,其他进程就不会知道它。如果你的数据是静态的,那就没关系。如果您需要更新它,它将无法正常工作。对于此方法或任何暗示使用单例的方法都是如此,除非您可以确保只运行一个Python进程(您可以这样做,但这不是此答案的目的)。
关于语法:
getattr(cache, 'data', '')
返回对象'cache'的名称'data'的属性。如果它不存在,则返回最后一个参数,这里是一个空字符串。
在Python中,or
是懒惰的,如果参数可以返回,它将停止评估参数。在我们的例子中,如果'data'是缓存的属性,它将在布尔上下文中True
,or
将认为它已经完成了它的工作(因为它只需要一个值{ {1}}返回True
)并返回True
而不运行True
。但是,如果“数据”不是缓存的属性,那么如果get_my_data()
将评估空字符串,请将其视为or
,然后运行False
。
为什么你可能不想这样做
get_my_data()
模块无论如何都会缓存正则表达式,因此您可能不再需要编译它们。其他数据可能表示为原始数据。将所有这些作为字符串和其他基元存储在缓存后端(例如memcached或redis)中,它将变得更加清晰。 另外,如果一个Python进程更新缓存,那么其他人将会意识到它。他们不会使用上面的代码片段。 您不应该输入settings.py文件:
答案 2 :(得分:1)
你可以加载它然后使用django缓存框架来存储它,这样它只会被加载一次。