只加载一次pickle列表-Django\Python
我有一个pickle文件,其中包含已编译正则表达式和其他数据的列表 加载大约需要1-1.5秒 在我的视图中使用此列表的好方法是什么,但pickle只处理一次文件? 编辑: 是否可以将导入到settings.py只加载一次pickle列表-Django\Python,python,django,django-views,pickle,Python,Django,Django Views,Pickle,我有一个pickle文件,其中包含已编译正则表达式和其他数据的列表 加载大约需要1-1.5秒 在我的视图中使用此列表的好方法是什么,但pickle只处理一次文件? 编辑: 是否可以将导入到settings.py 有什么想法吗?您可以加载它,然后使用django缓存框架来存储它,这样它只会加载一次 我将编写一个python模块——一个带有init方法的单例类,该方法将pickle数据读取到python对象中,然后使用您需要的任何“get”方法获取信息 然后在settings.py中调用初始化方法
有什么想法吗?您可以加载它,然后使用django缓存框架来存储它,这样它只会加载一次
我将编写一个python模块——一个带有init方法的单例类,该方法将pickle数据读取到python对象中,然后使用您需要的任何“get”方法获取信息 然后在settings.py中调用初始化方法。任何需要从中获取信息的操作都只需导入模块并使用get方法。如何操作 创建名为cache.py的模块,然后:
import cache
data = getattr(cache, 'data', '') or get_my_data()
这将只按服务器进程重新加载数据一次(这取决于您的设置、web服务器以及您使用WSGI或CGI的位置)。在dev web服务器(/manage.py runserver
)中,每次修改文件时,缓存都将失效
工作原理
Python中的模块对于每个Python进程只导入一次。如果多次使用import
,它将只返回对已导入模块的引用。因此,如果Apache运行的mod_wsgi有4个worker,get_my_data()
将只被调用4次,因为只有4个Python进程在运行。请记住,worker可能会死亡、重新加载、被杀死等,但它应该将对get\u my\u data()
的调用保持在最低限度
明白了:如果一个进程修改了缓存数据,其他进程将不知道它。如果您的数据是静态的,那么就可以了。如果你需要保持它的最新,它将不会工作。对于这个方法或任何暗示使用单例的方法都是如此,除非您可以确保只有一个Python进程在运行(您可以这样做,但这不是这个答案的目的)
关于语法:
getattr(缓存,'data','')
返回对象“cache”的名为“data”的属性。如果不存在,则返回最后一个参数,此处为空字符串
在Python中,或
是惰性的,如果可以返回,将停止计算参数。在我们的例子中,如果“数据”是缓存的属性,它将是一个布尔上下文中的<代码>真值>代码> >代码>或<>代码>将考虑它已经完成了它的作业(因为它只需要一个值是“代码>真的<代码>返回<代码>真< /代码>),并且将返回<代码>真< /代码>而不运行<代码> GETZYMYDATA()/<代码>。但是,如果“数据”不是缓存的属性,则如果<代码>或将评估一个空字符串,将其视为<代码> false <代码>,然后运行<代码> GETYMYODATA()< <代码> > < /P>
为什么你可能无论如何都不想这么做
re
模块缓存regex,因此您可能不再需要编译它们。其他数据可能可以表示为原始数据。将它们作为字符串和其他原语存储在缓存后端,比如memcached,这样会更干净Plus,如果一个Python进程更新缓存,那么其他进程将知道它。他们不喜欢上面的片段。- 如果您硬编码它,您的设置文件将是不可读的,并且很讨厌放在源代码管理工具中
- 您不能动态地将它放在这里,因为设置模块在Django中是只读的,除非您使用一些难看的黑客,这可能会导致意外的问题
那根本没用。缓存框架将再次对其进行pickle来存储它,但是如果使用memcached之类的东西,那么所有的内容都会存储在内存中,这会快得多。您还可以立即访问单个项目,而不必访问文件中该项目所在位置的项目。是否必须一次取消所有项目的存档?你不能只解开你需要的吗?