只加载一次pickle列表-Django\Python

只加载一次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中调用初始化方法

我有一个pickle文件,其中包含已编译正则表达式和其他数据的列表

加载大约需要1-1.5秒

在我的视图中使用此列表的好方法是什么,但pickle只处理一次文件?

编辑: 是否可以将导入到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> 为什么你可能无论如何都不想这么做

  • 如果你为网站的每一页加载了需要2秒钟才能为每个请求生成的内容,那么就有问题了。您可能需要重新思考您的体系结构
  • 如果数据不是要返回值,而是在用户操作之后运行一个进程,那么最好使用诸如的工具运行异步函数
  • 不管怎样,
    re
    模块缓存regex,因此您可能不再需要编译它们。其他数据可能可以表示为原始数据。将它们作为字符串和其他原语存储在缓存后端,比如memcached,这样会更干净Plus,如果一个Python进程更新缓存,那么其他进程将知道它。他们不喜欢上面的片段。
  • 关于settings.py的最后一句话 您不应在settings.py文件中输入:

    • 如果您硬编码它,您的设置文件将是不可读的,并且很讨厌放在源代码管理工具中
    • 您不能动态地将它放在这里,因为设置模块在Django中是只读的,除非您使用一些难看的黑客,这可能会导致意外的问题

    • 那根本没用。缓存框架将再次对其进行pickle来存储它,但是如果使用memcached之类的东西,那么所有的内容都会存储在内存中,这会快得多。您还可以立即访问单个项目,而不必访问文件中该项目所在位置的项目。是否必须一次取消所有项目的存档?你不能只解开你需要的吗?