gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 22:05:41 26 4
gpt4 key购买 nike

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

加载大约需要 1-1.5 秒。

在我的 View 中使用此列表的好方法是什么,但只对文件进行 pickle 一次?

编辑:

导入 settings.py 是否可以?


有什么想法吗?

最佳答案

你怎么做

创建一个名为 cache.py 的模块,然后:

import cache
data = getattr(cache, 'data', '') or get_my_data()

这将仅通过服务器进程重新加载一次数据(这将取决于您的设置、您的网络服务器以及您使用 WSGI 或 CGI 的位置)。在dev web server(./manage.py runserver)中,每修改一个文件,缓存就会失效。

工作原理

Python 中的模块只为每个 Python 进程导入一次。如果多次使用 import,它只会返回对已导入模块的引用。因此,如果您有一个运行 mod_wsgi 的 Apache 和 4 个 worker,get_my_data() 将仅被调用 4 次,因为只有 4 个 Python 进程在运行。请记住,worker 可能会死亡、被重新加载、被杀死等。但它应该将对 get_my_data() 的调用保持在最低限度。

陷阱:如果一个进程修改了缓存数据,其他进程将不会知道。如果您的数据是静态的,那没关系。如果您需要使其保持最新状态,它将无法正常工作。对于此方法或任何暗示使用单例的方法都是如此,除非您可以确保只有一个 Python 进程在运行(您可以,但这不是此答案的目的)。

关于语法:

getattr(cache, 'data', '') 返回对象“cache”的名为“data”的属性。如果它不存在,它返回最后一个参数,这里是一个空字符串。

在 Python 中, 是惰性的,如果可以返回,将停止评估参数。在我们的例子中,如果“数据”是缓存的一个属性,它将在 bool 上下文中为 Trueor 将认为它已经完成了它的工作(因为它需要只有一个值是 True 以返回 True) 并且将在不运行 get_my_data() 的情况下返回 True。但是,如果 'data' 不是缓存的属性,那么如果 将评估一个空字符串,将其视为 False,然后运行 ​​get_my_data().

为什么您可能无论如何都不想这样做

  1. 如果您为网站的每个页面加载的内容需要 2 秒才能为每个请求生成,那就有问题了。您可能需要重新考虑您的架构。
  2. 如果数据不是为了返回值,而是在用户操作后运行一个进程,那么最好运行一个异步函数,使用诸如 Celery 之类的工具。 .
  3. re 模块无论如何都会缓存正则表达式,因此您可能不再需要编译它们。其他数据可能可以表示为原始数据。将所有这些作为字符串和其他原语存储在缓存后端,例如 memcached 或 redis ,会干净很多。 另外,如果一个 Python 进程更新了缓存,那么其他进程将会知道它。他们不会使用上面的代码段。

关于settings.py的最后一句话

你不应该在 settings.py 文件中输入:

  • 如果您对其进行硬编码,您的设置文件将无法读取,而且放入源代码控制工具中也很烦人。
  • 你不能把它动态地放在这里,因为设置模块在 Django 中是只读的,除非你使用一些丑陋的 hack,这可能会导致意想不到的问题。

关于python - 只加载一次 pickle 列表 - Django\Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4933190/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com