Skip to main content
 首页 » 编程设计

python之Django/Python/FastCGI 进程究竟能持续多久

2025年05月04日31rubylouvre

我一直在使用 Django 开发一个网站,该网站使用使用自动安装程序和自定义模板系统设置的 FCGI 提供服务。

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

@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 文件中的数据。例如,我将从单独的文件中加载大段代码,而不是将它们留在模板中(在那里它们变得困惑)或在数据库中(在那里编辑它们不方便)。知道这个过程是持久的,我创建了一个临时内存缓存,方法是将我加载的文本保存在我的一个类的静态字典中:

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. 当您编辑 Python 文件时。
  2. 当您重新启动服务器时。
  3. 出现不可恢复的错误时。 也称为“仅在必须时”。

这样的缓存很好——每当您将任何内容存储在变量中时,您都会这样做。既然信息是只读的,这怎么可能不安全呢?尽量不要在重新启动服务器后立即将更改写入文件;但可能发生的最糟糕的事情是一个页面 View 被搞砸了。

有一种简单的方法可以确认这一切——日志记录。让装饰器在它们被调用时记录,并在您必须从磁盘加载文件时记录。