Pregunta

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. Debido a que rails no reutiliza el objeto, se creará un nuevo objeto, así como una nueva conexión SSH al servidor, para cada solicitud que se reciba. Para reducir el estrés del servidor, quiero cerrar la conexión SSH antes de que el objeto modelo se recolecte basura. Me pregunto si Ruby proporciona un mecanismo de notificación para informar al objeto de que será destruido. Si es así, podría usar esta notificación para saber cuándo cerrar las conexiones SSH. De lo contrario, tendré que hacerlo de forma manual cuando sepa que he terminado con el objeto.

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

¿Fue útil?

Solución

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

En otras palabras, desde la perspectiva de su programa, un objeto nunca es destruido o destruible. Por estas razones, debe repensar el problema (esta no es una necesidad poco común: liberación de recursos cuando el objeto ya no es necesario) para que se ajuste al paradigma de Ruby.

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

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 función finalizadora cuando se destruye.

Según http://pleac.sourceforge.net/pleac_ruby/classesetc.html puede que no se recolecte 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

Otros consejos

Publiqué una solución aquí en otro hilo de StackOverflow que implementa Ruby de una manera similar al administrador de contexto de Python. Desde el lado del cliente, la destrucción está implícita.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top