16

カスタム Rails モデルを作成しました。このモデルは、データベース テーブルではなく、実際のサーバーによって支えられています (したがって、 から継承されませんActiveRecord::Base)。サーバーから要求された情報を取得するために、サーバーへの SSH 接続を開きます。Rails はオブジェクトを再利用しないため、サーバーへの新しい SSH 接続と同様に、受信したリクエストに対して新しいオブジェクトが作成されます。サーバーのストレスを軽減するために、モデル オブジェクトがガベージ コレクションされる前に SSH 接続を閉じたいと考えています。ruby は、オブジェクトが破棄されることをオブジェクトに通知する通知メカニズムを提供しているのでしょうか? もしそうなら、この通知を使用して、SSH 接続をいつ閉じるかを知ることができます。そうでない場合は、オブジェクトが完成したことがわかったときに手動で行う必要があります。

これを手動で処理する必要がある場合、オブジェクトを明示的に破棄できますか? それとも私ができる最善のことですobject = nilか?

4

1 に答える 1

21

オブジェクトが破棄されたときに何が起こるかを制御する必要がある場合は、実際には自分で明示的に破棄する必要があります。これは設計によるものです。オブジェクトを明示的に破棄できることも想定されていません-これも設計によるものです。

つまり、プログラムの観点からは、オブジェクトが破棄されることも破棄可能になることもありません。これらの理由から、Ruby パラダイムに適合するように、問題を再考する必要があります (これは珍しくありません。オブジェクトが不要になったときにリソースを解放する必要があります)。

オブジェクトを nil に設定すると、ガベージ コレクターにヒントが与えられますが、必ずしもすぐに破棄されるわけではありません。

ただし、ガベージ コレクタで処理する必要がある場合は、読み進めてください。

デストラクタは直接サポートされていませんが、破棄されたときにファイナライザ関数を呼び出すことができます。

http://pleac.sourceforge.net/pleac_ruby/classesetc.htmlによると、元のオブジェクトへの参照が含まれている場合はガベージ コレクションされない可能性があるため、インスタンス メソッドではなくクラス メソッドである必要があります。

class MyClass
    def initialize
        ObjectSpace.define_finalizer(self,
                                     self.class.method(:finalize).to_proc)
    end
    def MyClass.finalize(id)
        puts "Object #{id} dying at #{Time.new}"
    end
end
于 2008-10-01T04:45:23.043 に答える