0

関数「.connect()」を持つ独自のモジュール「MyServer」を作成しました。

サーバーに接続したとき

import MyServer
con = MyServer.connect(...)

モジュール(「delMyServer」)を削除します。「con」もすぐに削除/破棄されると思います。

しかし、それは機能しません。たぶんその理由はガベージコレクターです。しかし、どうすれば「今すぐ削除」と言うことができますか。:)

4

2 に答える 2

2

サーバーへの接続が閉じていることを確認しようとしていると思いますか? これは正しい方法ではありません。いくつかのオプションがあります:

  1. MyServer.disconnect_all()メソッドを作成し、それを使用します。

    try: 
        con = MyServer.connect()
    finally:
         MyServer.disconnect_all()
    
  2. con.close()メソッドを作成し、それを使用します。

    con = MyServer.connect()
    try:
        ...
    finally:
        con.close()
    
  3. オブジェクトの__del__メソッドにクロージング ロジックを配置します。con

    class Connection:
        ...
        def __del__(self):
            # do closing things
    

    接続が完了したら、del con. del conオブジェクトを実際に削除するのではなくcon、参照カウントを 1 つ減らすだけなので、これはおそらく最良のオプションではないことに注意してください。他のものが保持されている場合、それは削除されません。

  4. (最良の選択肢です。)Connectionコンテキスト マネージャーとして記述し、おそらく使用contextlib.contextmanagerして支援します。次に、次のことができます。

    with con as Connection(...):
        ...
    

    ブロックが離れるとwith、クローズ ロジックを使用して (例外が発生した場合でも) 接続が自動的に閉じられます。


モジュール オブジェクトを削除しても接続が削除されない理由に興味がある場合は、参照カウントに基づく Python のメモリ管理を調べることをお勧めします。オブジェクトへの参照を作成するたびに、そのオブジェクトのカウンターが 1 増加し、参照が削除されるたびに (たとえばdel、範囲外に出るなどして)、カウンターは 1 減少します。このカウンターがゼロになるたびに、オブジェクトは削除されます。

あなたの場合、あなたconはつながりを作ります。これは接続オブジェクトへの参照であるため、参照カウントはゼロではありません。モジュールを削除すると、接続オブジェクトの参照カウントが減少する場合と減少しない場合がありますが、ゼロには減少しません。これconは、まだ参照であり、それを削除していないためです!

暗黙的にではなく、接続の終了ロジックを明示的に記述してみる必要があると思います。

于 2011-05-31T09:13:42.800 に答える
0

実行del後にオブジェクトへの参照がなくなった場合、オブジェクトはすぐに解放されるか、後でガベージ コレクションが行われ、オブジェクトが破棄される可能性がありますが、これは偶発的です。delオブジェクトへの参照を削除するだけで、削除しません。オブジェクトを直接削除します。モジュールには、システム全体で他の多くの参照があります。

接続を閉じたい場合は、明示的にそれを行う必要があります。そうしないと、接続自体がモジュールの削除を妨げる多くの原因の 1 つになります。実際には、モジュールを削除するにはかなりの労力を費やす必要があるため、通常は試す価値はありません。

于 2011-05-31T09:18:01.113 に答える