Domanda

Lunga storia breve, ho una sostanziale applicazione Python che, tra le altre cose, fa outcall per "losetup", "monte", etc.su Linux.Essenzialmente consumo di risorse di sistema che devono essere rilasciati al termine.

Se la mia applicazione si blocca, voglio assicurare a queste risorse di sistema vengono rilasciati correttamente.

Ha senso fare qualcosa di simile?

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

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

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

Questo è qualcosa che è in genere fatto?C'è un modo migliore?Forse il distruttore di una classe singleton?

È stato utile?

Soluzione

Mi piace il top a livello di gestori di eccezioni, in generale (a prescindere dalla lingua).Sono un ottimo posto per la pulitura delle risorse che non possono essere immediatamente relative al consumo di risorse all'interno del metodo che genera l'eccezione.

È anche un luogo fantastico per registro tali eccezioni se si dispone di un tale quadro.Top a livello di gestori di catturare quei bizzarri eccezioni non piano e permettono di correggere in futuro, in caso contrario, non si può mai sapere su di loro a tutti.

Basta essere attenti a che il top a livello di gestore non gettare le eccezioni!

Altri suggerimenti

Un distruttore (come in __del__ method) è una cattiva idea, in quanto questi non sono garantiti per essere chiamato.Il atexit modulo è un approccio più sicuro, anche se questi non sarà ancora a fuoco se l'interprete Python si blocca (piuttosto che l'applicazione Python), o se il sistema operativo._exit() è utilizzato, o il processo viene ucciso in modo aggressivo, o il computer si riavvia.(Naturalmente, l'ultima voce non è un problema nel tuo caso.) Se il processo di crash-prone (utilizza il volubile di terze parti, moduli di estensione, per esempio) si può fare la pulizia in un semplice processo padre per più di isolamento.

Se non si è molto preoccupato, utilizzare il atexit modulo.

Applicazione ampia gestore è bene.Essi sono l'ideale per la registrazione.Basta fare in modo che l'applicazione più ampio è durevole ed è improbabile incidente stesso.

se si utilizzano le classi, è necessario liberare le risorse allocate nel loro distruttori invece, naturalmente.Utilizzare la prova:su tutta la domanda solo se si desidera liberare risorse che non sono già liberata dalle classi' distruttori.

E invece di utilizzare un catch-all, ad eccezione di:, è consigliabile utilizzare il seguente blocco:

try:
    main()
finally:
    cleanup()

Assicurare che la pulizia in più divinatori modo.

Che sembra un approccio ragionevole, e più semplice e affidabile di un distruttore di una classe singleton.Si potrebbe anche guardare la "atexit modulo".(Pronunciato "in uscita", non "un tex" o qualcosa di simile.Ho confuso che, per un lungo periodo di tempo.)

Prendere in considerazione la scrittura di un contesto manager e con l'istruzione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top