私は、オペレーティングシステムリソース(ファイルやスレッドなど)を使用するモジュールレベルのグローバル変数を正しく管理する方法を探しています。Pythonでモジュールをリロードするときに副作用を伴うグローバルオブジェクトを管理する
問題は、モジュールを再読み込みするときに、新しいリソースを作成する前に自分のリソースを適切に処理する必要があることです(ファイルを閉じたりスレッドを終了させるなど)。
だから、私はそれらのシングルトンオブジェクトを管理するためのより良いパターンが必要です。
私は、オペレーティングシステムリソース(ファイルやスレッドなど)を使用するモジュールレベルのグローバル変数を正しく管理する方法を探しています。Pythonでモジュールをリロードするときに副作用を伴うグローバルオブジェクトを管理する
問題は、モジュールを再読み込みするときに、新しいリソースを作成する前に自分のリソースを適切に処理する必要があることです(ファイルを閉じたりスレッドを終了させるなど)。
だから、私はそれらのシングルトンオブジェクトを管理するためのより良いパターンが必要です。
私は、モジュールのリロードでドキュメントを読んでいると、これは非常に興味深いです:
モジュールがリロードされると、その辞書(モジュールの グローバル変数を含む)が保持されています。名前の再定義により、古い定義が に上書きされるため、これは一般的に問題ではありません。新しい モジュールのバージョンで、古い バージョンで定義された名前が定義されていない場合、古い定義が残っています。それは、オブジェクト のグローバルテーブルやキャッシュを維持している場合、この機能は モジュールの有利に使用することができます - try文では、テーブルの存在をテストし、必要に応じて、その初期化を スキップすることができます
try:
cache
except NameError:
cache = {}
だから、オブジェクトがすでに存在するかどうかをチェックして、新しいオブジェクトを作成する前にそれらを破棄することができます。あなたがDjangoアプリケーションを開発するため、あなたが適切なサーバーを使用することを意味している場合
あなたは、...など閉じたファイルを管理するために
しかしをモンキーパッチしたり、フォークDjangoはdjango dev server reloading featureにフックすると、適切なことを行う必要があります将来あなたのアプリケーションにサービスを提供するには、グローバル変数の管理を検討し、semaphoresとall that jazzと考えるべきです。
しかし、このルートに進み、エラーと脱毛しやすいこの難しいコードをすべて実装してください。 nosqlデータベース(redis、mongodb、neo4j、hadoop ...)のような他のソリューションと、celeryとgearmanのようなバックグラウンドプロセスマネージャを考慮する必要があります。これらのすべてがあなたのユースケースではなく、あなた自身とグローバル変数を作成して管理することを避けることができない場合は、NFSを混乱させる場合を除き、クライアントがWebサーバースレッドであるパターンを考慮してください。
モジュールをリロードするにはどうすればよいですか?ピックリングが関与していますか? – amirouche
これはdjangoで使用されているので、ホットリロードのためにどのようなメカニズムが使用されています... – fortran