2011-05-13 8 views
5

私はGoogle App Engine開発環境について好きなことの一つです。私は、Pythonのソースファイル、他の静的なファイル、または設定ファイルを変更するたびにサーバを再起動する必要はありません。それは私を台無しにして、私は他のサーバー環境(tornadoweb、web.py、node.js)で作業しているときにサーバーを再起動することを忘れてしまいます。Google App Engine dev_appserver.pyは再起動せずに新鮮なコンテンツをどのように提供しますか?

どのようにGAEがそのことを説明できますか?同じことを達成するために他のサーバー(少なくともPythonベース)を作るのはどれほど難しいですか? GAEのようなウェブサーバの

答えて

3

dev_appserver.py(link)のソースを表示できます。 ModuleManagerのように見えるがsys.modulesのコピーを作成し、時間に基づいて変更を追跡するために、各モジュールを監視します。

class ModuleManager(object): 
    """Manages loaded modules in the runtime. 

    Responsible for monitoring and reporting about file modification times. 
    Modules can be loaded from source or precompiled byte-code files. When a 
    file has source code, the ModuleManager monitors the modification time of 
    the source file even if the module itself is loaded from byte-code. 
    """ 

http://code.google.com/p/googleappengine/source/browse/trunk/python/google/appengine/tools/dev_appserver.py#3636

+0

あなたはもっとしてください手の込んだだろうか?特に、同じことを達成するために他のサーバー(少なくともPythonベース)を作るのはどれほど難しいのですか? – avalancha

2

ロット、Pythonのドキュメントからサーバプロセス

import something 

if is_changed(something) 
    somthing = reload(something) 

引用再起動せずにコードの変更に影響を見るためにパイソンreloadモジュールを使用しますリロード(モジュール)が実行されると を:

Pythonモジュールのコードが再コンパイルされ、モジュールレベルのコードが再実行され、モジュールの辞書内の名​​前にバインドされた新しいオブジェクトセットが定義されます。拡張モジュールのinit関数は2度目に呼び出されません。

Pythonの他のすべてのオブジェクトと同様に、古いオブジェクトは、参照カウントがゼロになった後に再生されます。

モジュール名前空間内の名前が、新しいオブジェクトまたは変更されたオブジェクトを指すように更新されます。 古いオブジェクト(モジュールの外部の名前など)への他の参照は、新しいオブジェクトを参照するためにリバウンドされず、必要に応じてそれぞれの名前空間で更新する必要があります。

関連する問題