オペレーティング システムのリソース (ファイルやスレッドなど) を使用するモジュール レベルのグローバル変数を正しく管理する方法を探しています。
問題は、モジュールがリロードされたときに、新しいリソースを作成する前に、リソースを適切に破棄する必要があることです (ファイルを閉じるか、スレッドを終了するなど)。
したがって、これらのシングルトン オブジェクトを管理するには、より優れたパターンが必要です。
オペレーティング システムのリソース (ファイルやスレッドなど) を使用するモジュール レベルのグローバル変数を正しく管理する方法を探しています。
問題は、モジュールがリロードされたときに、新しいリソースを作成する前に、リソースを適切に破棄する必要があることです (ファイルを閉じるか、スレッドを終了するなど)。
したがって、これらのシングルトン オブジェクトを管理するには、より優れたパターンが必要です。
私はモジュールのリロードに関するドキュメントを読んでいますが、これは非常に興味深いものです。
モジュールがリロードされると、そのディクショナリ(モジュールのグローバル変数を含む)が保持されます。名前の再定義は古い定義を上書きするため、これは通常問題にはなりません。モジュールの新しいバージョンで古いバージョンで定義された名前が定義されていない場合、古い定義が残ります。この機能は、グローバルテーブルまたはオブジェクトのキャッシュを維持する場合にモジュールの利点として使用できます。tryステートメントを使用すると、テーブルの存在をテストし、必要に応じて初期化をスキップできます。
try:
cache
except NameError:
cache = {}
したがって、オブジェクトがすでに存在するかどうかを確認し、新しいオブジェクトを作成する前にそれらを破棄することができます。
django devサーバーのリロード機能にフックし、ファイルのクローズなどを管理するために適切なことを行うには、djangoをmonkeypatchまたはforkする必要があります...
しかし 、あなたは django アプリケーションを開発しているので、将来的に適切なサーバーを使用してアプリを提供するつもりなら、グローバル変数の管理を検討し、セマフォとそのすべてについて考える必要があります。
しかし、このルートに進む前に、この難しいコードをすべて実装して、エラーや抜け毛が発生しやすいようにしてください。nosqlデータベース ( redis、mongodb、neo4j、hadoopなど) やceleryやgearmanなどのバックグラウンド プロセス マネージャーなどの他のソリューションを検討する必要があります。これらすべてがユースケースに適合せず、自分でファイルとグローバル変数を作成して管理することを避けられない場合は、 NFSを台無しにしたくない場合を除き、クライアントが Web サーバー スレッドであるクライアント/サーバーパターンを検討してください。