Pergunta

Eu escrevi um modelo Rails personalizados. Este modelo é apoiado por um servidor realmente não por uma tabela de banco de dados (para que ele não herda de ActiveRecord::Base). A fim de obter as informações solicitadas a partir do servidor eu abrir uma conexão SSH a ele. Porque trilhos não reutilização objeto um novo objeto, bem como uma nova conexão SSH para o servidor, será criado para o pedido já que é recebido. Para reduzir o estresse servidor Quero fechar a conexão SSH antes que o objeto modelo recebe lixo coletado. Eu estou querendo saber se ruby ??fornecer um mecanismo de notificação para informar o objeto que ele será destruído? Se assim eu poderia usar esta notificação para saber quando fechar as conexões SSH. Se eu não precisará fazê-lo manual quando eu sei que eu estou acabado com o objeto.

Se eu preciso tomar cuidado manualmente a isso, posso explicitamente destruir o objeto? Ou é o melhor que pode fazer é object = nil?

Foi útil?

Solução

Se você precisa controlar o que acontece quando um objeto é destruído, você realmente deve ser explicitamente destruí-la a si mesmo - isso é por design. Você não deveria ser capaz de destruir um objeto explicitamente ou -. Isto também é por design

Em outras palavras, a partir da perspectiva do seu programa, um objeto nunca é destruído ou destrutível. Por estas razões, você deve repensar o problema (isto não é uma necessidade incomum - liberação de recursos quando o objeto não é mais necessário) para que ele se encaixa no paradigma Rubi

.

Definir o objeto a zero dá uma dica para o coletor de lixo, mas não destrói necessariamente imediatamente.

No entanto, se você deve ter a alça coletor de lixo, então continue a ler.

Não há suporte direto para um destruidor, mas você pode tê-lo chamar um finalizador função quando ele é destruído.

De acordo com a http://pleac.sourceforge.net/pleac_ruby/classesetc.html não pode ser recolhido o lixo, se ele contém uma referência ao objecto original, de modo que tem de ser um método de classe e não um método de instância.

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

Outras dicas

Eu postei uma solução aqui em outro segmento StackOverflow que implementa o Ruby de uma maneira que é semelhante a gerente de contexto do Python. Do lado do cliente, a destruição está implícita.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top