2012-01-25 2 views
1

私は、オペレーティングシステムリソース(ファイルやスレッドなど)を使用するモジュールレベルのグローバル変数を正しく管理する方法を探しています。Pythonでモジュールをリロードするときに副作用を伴うグローバルオブジェクトを管理する

問題は、モジュールを再読み込みするときに、新しいリソースを作成する前に自分のリソースを適切に処理する必要があることです(ファイルを閉じたりスレッドを終了させるなど)。

だから、私はそれらのシングルトンオブジェクトを管理するためのより良いパターンが必要です。

+0

モジュールをリロードするにはどうすればよいですか?ピックリングが関与していますか? – amirouche

+0

これはdjangoで使用されているので、ホットリロードのためにどのようなメカニズムが使用されています... – fortran

答えて

1

私は、モジュールのリロードでドキュメントを読んでいると、これは非常に興味深いです:

モジュールがリロードされると、その辞書(モジュールの グローバル変数を含む)が保持されています。名前の再定義により、古い定義が に上書きされるため、これは一般的に問題ではありません。新しい モジュールのバージョンで、古い バージョンで定義された名前が定義されていない場合、古い定義が残っています。それは、オブジェクト のグローバルテーブルやキャッシュを維持している場合、この機能は モジュールの有利に使用することができます - try文では、テーブルの存在をテストし、必要に応じて、その初期化を スキップすることができます

try: 
    cache 
except NameError: 
    cache = {} 

だから、オブジェクトがすでに存在するかどうかをチェックして、新しいオブジェクトを作成する前にそれらを破棄することができます。あなたがDjangoアプリケーションを開発するため、あなたが適切なサーバーを使用することを意味している場合

0

あなたは、...など閉じたファイルを管理するために

しかしをモンキーパッチしたり、フォークDjangoはdjango dev server reloading featureにフックすると、適切なことを行う必要があります将来あなたのアプリケーションにサービスを提供するには、グローバル変数の管理を検討し、semaphoresall that jazzと考えるべきです。

しかし、このルートに進み、エラーと脱毛しやすいこの難しいコードをすべて実装してください。 nosqlデータベース(redismongodbneo4jhadoop ...)のような他のソリューションと、celerygearmanのようなバックグラウンドプロセスマネージャを考慮する必要があります。これらのすべてがあなたのユースケースではなく、あなた自身とグローバル変数を作成して管理することを避けることができない場合は、NFSを混乱させる場合を除き、クライアントがWebサーバースレッドであるパターンを考慮してください。

関連する問題