문제

커스텀 레일 모델을 작성했습니다. 이 모델은 실제로 데이터베이스 테이블이 아닌 실제로 서버에 의해 뒷받침됩니다 (따라서 상속되지 않습니다. ActiveRecord::Base). 서버에서 요청 된 정보를 얻으려면 SSH 연결이 열립니다. Rails는 개체를 재사용하지 않기 때문에 새로운 객체와 서버에 대한 새로운 SSH 연결이 수신 된 요청에 따라 생성됩니다. 서버 응력을 줄이기 위해 모델 객체가 쓰레기를 수집하기 전에 SSH 연결을 닫으려고합니다. 루비가 객체가 파괴 될 것을 알리는 알림 메커니즘을 제공하는지 궁금합니다. 그렇다면이 알림을 사용하여 SSH 연결을 닫을시기를 알 수 있습니다. 그렇지 않다면 내가 객체로 끝났다는 것을 알면 매뉴얼을해야합니다.

수동으로 처리해야한다면 개체를 명시 적으로 파괴 할 수 있습니까? 아니면 내가 할 수있는 최선은입니다 object = nil?

도움이 되었습니까?

해결책

물체가 파괴 될 때 발생하는 일을 제어해야한다면, 실제로 직접 파괴해야합니다. 이것은 디자인에 의한 것입니다. 당신은 객체를 명시 적으로 파괴 할 수 없어야합니다. 이것은 또한 디자인에 의한 것입니다.

다시 말해, 프로그램의 관점에서, 물체는 결코 파괴되거나 파괴 될 수 없습니다. 이러한 이유로 문제를 다시 생각해야합니다 (이것은 드문 필요가 아닙니다 - 더 이상 필요하지 않은 경우 리소스의 방출) 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

다른 팁

솔루션을 게시했습니다 여기 Python의 컨텍스트 관리자와 유사한 방식으로 Ruby를 구현하는 다른 stackoverflow 스레드에서. 고객 측에서 파괴는 암시 적입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top