Pregunta

En pocas palabras, tengo una aplicación Python importante que, entre otras cosas, realiza salidas para "losetup", "mount", etc.en Linux.Básicamente, consume recursos del sistema que deben liberarse cuando esté completo.

Si mi aplicación falla, quiero asegurarme de que estos recursos del sistema se liberen correctamente.

¿Tiene sentido hacer algo como lo siguiente?

def main():
    # TODO: main application entry point
    pass

def cleanup():
    # TODO: release system resources here
    pass

if __name__ == "__main__":
    try:
        main()
    except:
        cleanup()
        raise

¿Es esto algo que se hace normalmente?¿Existe una mejor manera?¿Quizás el destructor de una clase singleton?

¿Fue útil?

Solución

Me gustan los controladores de excepciones de alto nivel en general (independientemente del idioma).Son un excelente lugar para limpiar recursos que pueden no estar inmediatamente relacionados con los recursos consumidos dentro del método que genera la excepción.

También es un lugar fantástico para registro esas excepciones si cuenta con dicho marco.Los controladores de nivel superior detectarán aquellas excepciones extrañas que no planeó y le permitirán corregirlas en el futuro; de lo contrario, es posible que nunca se entere de ellas.

¡Solo tenga cuidado de que su controlador de nivel superior no genere excepciones!

Otros consejos

Un destructor (como en un método __del__) es una mala idea, ya que no se garantiza que se llamen.El módulo atexit es un enfoque más seguro, aunque aún no se activarán si el intérprete de Python falla (en lugar de la aplicación Python), o si se usa os._exit(), o el proceso se cierra agresivamente, o la máquina se reinicia.(Por supuesto, el último elemento no es un problema en su caso). Si su proceso es propenso a fallar (por ejemplo, utiliza módulos de extensión de terceros volubles), es posible que desee realizar la limpieza en un proceso principal simple para Más aislamiento.

Si no estás realmente preocupado, utiliza el módulo atexit.

El controlador de toda la aplicación está bien.Son geniales para iniciar sesión.Solo asegúrese de que la aplicación para toda la aplicación sea duradera y sea poco probable que falle.

Si usas clases, deberías liberar los recursos que asignan en sus destructores, por supuesto.Utilice el intento:en toda la aplicación solo si desea liberar recursos que aún no están liberados por los destructores de sus clases.

Y en lugar de usar un comodín excepto:, debes usar el siguiente bloque:

try:
    main()
finally:
    cleanup()

Eso asegurará la limpieza de una manera más pitónica.

Parece un enfoque razonable y más sencillo y confiable que un destructor en una clase singleton.También puedes mirar el "atexit"módulo.(Se pronuncia "al salir", no "un mensaje de texto" o algo así.Lo confundí durante mucho tiempo.)

Considere escribir un administrador de contexto y usar la declaración with.

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