6

初期化コストが高い共有リソースがあるため、システム全体でアクセスしたい(基本的に一部の計測に使用されるため、軽量である必要があります)。そこで、セットアップとアクセスを管理するモジュールを作成しました。リソースの遅延初期化を行い、モジュールのグローバル変数に保存します。次に、このモジュールの関数をシステム全体で使用して、リソースを操作します。
- 今、リソースを再初期化する必要があるかどうか (またはどのくらいの頻度で) を考えていますか?
- CPython ではオブジェクトが参照カウント 0 (またはその付近) でガベージ コレクションされることはわかっていますが、モジュールが現在実行されていなくても、参照としてカウントされるモジュールに格納されていますか?

コードの例: _connect() が遅いモジュールがあります。システム全体で report_safely() を使用し、最終的に _connect() をできるだけ呼び出さないようにしたいと考えています。

__metrics = None


def _connect():
    global __metrics

    client = SomeSlowToSetUpClient()
    __metrics = SomeMetrics(client)
    client.connect()


def report_safely():
       if not __metrics:
           _connect()

       __metrics.execute_lightweight_code()
4

2 に答える 2

0

グローバルを含むモジュールが実行の開始から終了までスコープ内にある場合、グローバルは対象になります。ただし、クラスインスタンスを使用する方がきれいかもしれません。

于 2013-06-25T15:16:32.847 に答える