【发布时间】:2011-10-12 05:08:52
【问题描述】:
我一直在使用 Django 开发一个网站,该网站使用 FCGI 设置,使用自动安装程序和自定义模板系统。
正如我现在设置的那样,每个视图都是一个类的实例,它在加载时绑定到模板文件,而不是在执行时。也就是说,类通过装饰器绑定到模板:
@include("page/page.xtag") # bind template to view class
class Page (Base):
def main(self): # main end-point to retrieve web page
blah = get_some_stuff()
return self.template.main(data=blah) # evaluates template using some data
我注意到的一件事是,由于 FCGI 不会创建新进程并在每次请求时重新加载所有模块/类,因此对模板的更改不会自动出现在网站上,直到我强制重新启动(即通过编辑/保存一个python文件)。
网页还包含大量存储在文件系统中的 .txt 文件中的数据。例如,我将从单独的文件中加载大的 sn-ps 代码,而不是将它们留在模板中(它们使它们混乱)或数据库(编辑它们不方便)。知道这个过程是持久的,我通过将我加载到静态字典中的文本保存在我的一个类中来创建一个临时内存缓存:
class XLoad:
rawCache = {} #{name : (time, text)}
@staticmethod
def loadRaw(source):
latestTime = os.stat(source).st_mtime
if source in XLoad.rawCache.keys() and latestTime < XLoad.rawCache[source][0]:
# if the cached version of file is up to date, use it
return XLoad.rawCache[source][1]
else:
# otherwise read it from disk, dump it in cache and use that
text = open(source).read()
XLoad.rawCache[source] = (latestTime, text)
return text
这大大加快了一切速度,因为我从文件系统中一一加载的两打左右的 code-sn-ps 现在直接从进程的内存中获取。每次我强制重启时,一个请求会很慢,而缓存已满,然后又变得异常快。
我的问题是,究竟是什么决定了进程如何/何时重新启动、类和模块重新加载以及我保留在静态字典中的数据被清除?它是否依赖于我安装的 Python、Django、Apache 或 FastCGI?它是基于时间、请求数量、负载还是伪随机的确定性的?进行这种内存缓存是否安全(这真的非常简单方便!),还是我应该研究一些缓存这些文件读取的正确方法?
【问题讨论】:
标签: python django apache fastcgi