2008-10-01 17 views
16

He escrito un modelo personalizado de Rails. Este modelo está respaldado por un servidor en realidad no por una tabla de base de datos (por lo que no hereda de ActiveRecord::Base). Para obtener la información solicitada del servidor, abro una conexión SSH. Como los rieles no reutilizan el objeto, se creará un objeto nuevo, así como una nueva conexión SSH con el servidor, para cada solicitud que se reciba. Para reducir el estrés del servidor, deseo cerrar la conexión SSH antes de que el objeto modelo obtenga la recolección de basura. Me pregunto ¿Ruby proporciona un mecanismo de notificación para informar al objeto que será destruido? De ser así, podría usar esta notificación para saber cuándo cerrar las conexiones SSH. Si no, tendré que hacerlo manual cuando sé que he terminado con el objeto.Notificación de destrucción de objetos en Ruby

Si tengo que encargarme manualmente de esto, ¿puedo destruir el objeto explícitamente? ¿O es lo mejor que puedo hacer es object = nil?

Respuesta

21

Si necesita controlar lo que sucede cuando se destruye un objeto, realmente debería destruirlo usted mismo explícitamente, esto es por diseño. No se supone que puedas destruir un objeto explícitamente tampoco, esto también es por diseño.

En otras palabras, desde la perspectiva de su programa, un objeto nunca se destruye o destruye. Por estas razones, debe volver a pensar el problema (esta no es una necesidad poco común, es decir, liberar recursos cuando el objeto ya no es necesario) para que encaje en el paradigma de Ruby.

Establecer el objeto como nulo da una pista al recolector de basura, pero no necesariamente lo destruye inmediatamente.

Sin embargo, si debe hacer que el recolector de basura lo maneje, siga leyendo.

No hay soporte directo para un destructor, pero puede hacer que llame a finalizer function cuando se destruye.

De acuerdo con http://pleac.sourceforge.net/pleac_ruby/classesetc.html, puede no ser basura si contiene una referencia al objeto original, por lo que debe ser un método de clase y no un método de instancia.

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 
0

he publicado una solución here en otro hilo StackOverflow que implementa Rubí de una manera que es similar al gestor de contexto de Python. Desde el lado del cliente, la destrucción está implícita.

Cuestiones relacionadas