2011-07-24 67 views
2

我一直在Django的网站上工作,使用FCGI使用自动安装程序和自定义模板系统进行设置。Django/Python/FastCGI进程持续多久?

正如我现在设置的那样,每个View都是一个类的实例,它在加载时间处绑定到模板文件,而不是执行时间。也就是说,类是通过装饰绑定到模板:

@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文件的数据。例如,我将从单独的文件中加载大量代码片段,而不是将它们留在模板中(它们将它们混淆在一起)或放入数据库(编辑它们不方便)。知道这个过程是持续的,我创建了一个临时的memcache通过保存我装在一个静态字典在我班的一个文本:

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 

这加快了一切显着,因为这两个十几码我从文件系统中逐一加载的小片现在直接从进程的内存中取出。每当我强制重启时,一个请求缓慢,而缓存填满,然后再次变得快速。

我的问题是,究竟是什么决定了/当进程被重启,类和模块再次上膛,我一直在我的静态辞典的数据清除?它依赖于我的Python,Django,Apache还是FastCGI的安装?它是基于时间,请求数量,负载或伪随机确定性的吗?做这种内存中缓存(这真的很容易和方便!)是安全的,还是应该研究一些正确的缓存这些文件读取的方法?

回答

1

这听起来像你已经知道这一点。

  1. 当您编辑Python文件。
  2. 重新启动服务器时。
  3. 当存在不可恢复的错误时。 也被称为“只有当它必须”。

像这样缓存很好 - 只要你在变量中存储任何东西,你就会这样做。由于信息是只读的,这怎么可能不安全?尝试在重新启动服务器后不要将更改写入文件;但可能发生的最糟糕的事情是一个页面视图变得混乱。

有一个简单的方法来证实这一切 - 日志记录。在你的装饰器被调用时记录它们,并记录何时必须从磁盘加载文件。