2011-07-24 3 views
2

私はDjangoのWebサイトで働いており、自動インストーラとカスタムテンプレートシステムを使ってFCGIをセットアップしました。Django/Python/FastCGIプロセスの持続時間はどのくらいですか?

私は今設定したので、各ビューは、ロード時にのテンプレートファイルにバインドされたクラスのインスタンスであり、実行時間ではありません。それはクラスはデコレータを経由して、テンプレートにバインドされ、次のとおりです。私は気づいた

@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 

、2ダースかそこらのコードので:プロセスが永続的であることを知って、私は私のクラスのいずれかで静的辞書にロードされたテキストを保存することにより、アドホックのmemcacheを作成しました私がファイルシステムから1つずつロードしていたスナップショットは、現在、プロセスのメモリから直接取得されていました。私は再起動を強制するたびに、キャッシュが満杯になったときに1回のリクエストで遅くなり、再び高速になります。

私の質問は、プロセスがどのように再起動し、クラスとモジュールがリロードされ、静的辞書に保存されたデータがパージされたかを正確に判断するものですか?それはPython、Django、Apache、またはFastCGIのインストールに依存していますか?それは時間、要求の数、負荷、または擬似ランダムに基づいて決定論的ですか?そして、この種のメモリ内キャッシュ(実際には非常に簡単で便利です)を行うのは安全ですか、あるいはこれらのファイル読み取りをキャッシュする適切な方法を調べるべきですか?

答えて

1

あなたはすでにこれを知っているようですね。

  1. Pythonファイルを編集するとき。
  2. サーバーを再起動するとき。
  3. 回復不可能なエラーが発生した場合。 「必要な場合のみ」とも呼ばれます。

このようなキャッシングはうまくいきます。変数に何かを保存するときはいつでもそれをやっています。情報は読み取り専用なので、どうしてこれは安全ではないでしょうか?サーバーを再起動した直後にファイルに変更を書き込まないようにしてください。しかし、起こりうる最悪のことは、1ページビューが乱れてしまうことです。

このすべてのログを確認する簡単な方法があります。デコレータは呼び出されたときにログをとり、ディスクからファイルをロードする必要があるときにはログに記録します。

関連する問題