Django / Python / FastCGI进程到底需要多长时间?

时间:2011-07-24 22:20:40

标签: python django apache fastcgi

我一直在使用Django的网站,使用自动安装程序和自定义模板系统设置FCGI。

正如我现在设置的那样,每个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的安装吗?它是基于时间,请求数量,负载数量还是伪随机数的确定性?这种内存缓存是否安全(这非常简单方便!),或者我应该研究一些缓存这些文件读取的正确方法吗?

2 个答案:

答案 0 :(得分:1)

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

  1. 编辑Python文件时。
  2. 重新启动服务器时。
  3. 当存在不可恢复的错误时。 也被称为“只有当它必须”。
  4. 像这样的缓存很好 - 只要你在变量中存储任何东西,你就会这样做。由于信息是只读的,这怎么可能不安全?重新启动服务器后,请尽量不要对文件进行更改;但可能发生的最糟糕的事情是一个页面视图搞砸了。

    有一种简单的方法可以确认所有这些 - 记录。让装饰者在调用时记录,并在必须从磁盘加载文件时进行记录。

答案 1 :(得分:0)