Frage

Um es kurz zu machen: Ich habe eine umfangreiche Python-Anwendung, die unter anderem Outcalls für „losetup“, „mount“ usw. durchführt.unter Linux.Verbraucht im Wesentlichen Systemressourcen, die nach Abschluss freigegeben werden müssen.

Wenn meine Anwendung abstürzt, möchte ich sicherstellen, dass diese Systemressourcen ordnungsgemäß freigegeben werden.

Ist es sinnvoll, so etwas wie das Folgende zu tun?

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

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

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

Wird das normalerweise gemacht?Gibt es einen besseren Weg?Vielleicht der Destruktor in einer Singleton-Klasse?

War es hilfreich?

Lösung

Ich mag Top-Level-Exception-Handler im Allgemeinen (unabhängig von der Sprache). Sie sind ein großartiger Ort, um Bereinigungs Ressourcen, die nicht unmittelbar auf Ressourcen in Zusammenhang stehen kann innerhalb der Methode verbraucht, der die Ausnahme auslöst.

Es ist auch ein fantastischer Ort, um log diese Ausnahmen, wenn Sie einen solchen Rahmen an der richtigen Stelle. Top-Level-Handler werden diese bizarren Ausnahmen fangen Sie nicht haben wollen und lassen Sie sie in der Zukunft zu korrigieren, sonst, die Sie nie überhaupt über sie wissen können.

Genau darauf achten, dass Ihre Top-Level-Handler nicht Ausnahmen werfen!

Andere Tipps

Ein destructor (wie in einer __del__-Methode) ist eine schlechte Idee, da diese nicht aufgerufen werden, sind garantiert. Das atexit Modul ist ein sicherer Ansatz, auch wenn diese noch nicht, ob die Dolmetscher Abstürze Python Feuer (und nicht die Python-Anwendung), oder wenn os._exit () verwendet wird, oder der Prozess wird aggressiv getötet, oder die Maschine neu gestartet. (Natürlich ist der letzte Punkt ist nicht ein Problem in Ihrem Fall.) Wenn Ihr Prozess ist crash-anfällig (es verwendet wankelmütig Dritterweiterungsmodule, zum Beispiel) Sie möchten die Bereinigung in einem einfachen Eltern-Prozess tun für mehr Isolation.

Wenn Sie nicht wirklich besorgt sind, verwenden Sie das atexit Modul.

Der anwendungsweite Handler ist in Ordnung.Sie eignen sich hervorragend zum Protokollieren.Stellen Sie einfach sicher, dass die anwendungsweite Version langlebig ist und wahrscheinlich nicht selbst abstürzt.

Wenn Sie Klassen verwenden, sollten Sie die Ressourcen, die sie stattdessen in ihre Destruktoren zuteilen befreien, natürlich. Verwenden Sie den Versuch. Auf gesamte Anwendung nur, wenn Sie freie Ressourcen wollen, die von Ihren Klassen Destruktoren nicht bereits freigesetzt werden

Und statt der Verwendung eines catch-all außer :, sollten Sie den folgenden Block verwenden:

try:
    main()
finally:
    cleanup()

Das wird gewährleisten Bereinigung in einer pythonic Art und Weise.

Das scheint wie ein vernünftiger Ansatz, und einfacher und zuverlässiger als ein destructor auf einer Singleton-Klasse. Sie könnten auch einen Blick auf die „ atexit “ -Modul. (Ausgesprochen „an der Ausfahrt“, nicht „ein Tex es“ oder so ähnlich. Ich, dass für eine lange Zeit verwirrt.)

Betrachten sie einen Kontext-Manager zu schreiben und mit der Anweisung with.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top