Question

En résumé, j’ai une application Python importante qui, entre autres choses, renvoie à "losetup", "mount", etc. sous Linux. Consomme essentiellement des ressources système qui doivent être libérées à la fin.

Si mon application tombe en panne, je souhaite m'assurer que ces ressources système sont correctement libérées.

Est-il judicieux de faire quelque chose comme ce qui suit?

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

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

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

Est-ce quelque chose qui est généralement fait? Y a-t-il un meilleur moyen? Peut-être le destructeur dans une classe singleton?

Était-ce utile?

La solution

J'aime les gestionnaires d’exception de premier niveau en général (quelle que soit la langue). C’est un excellent endroit pour nettoyer des ressources qui ne sont peut-être pas immédiatement liées aux ressources consommées dans la méthode qui lève l’exception.

C’est également un endroit fantastique pour connecter ces exceptions si vous disposez d’un tel cadre. Les gestionnaires de niveau supérieur captureront les exceptions bizarres que vous n'aviez pas prévues et vous permettront de les corriger ultérieurement, sinon vous risquez de ne jamais les connaître du tout.

Veillez simplement à ce que votre gestionnaire de niveau supérieur ne lève pas d'exception!

Autres conseils

Un destructeur (comme dans une méthode __del__) est une mauvaise idée, car il n'est pas garanti que ces appels soient appelés. Le module atexit est une approche plus sûre, bien que ceux-ci ne se déclenchent toujours pas si l'interpréteur Python se bloque (plutôt que l'application Python), si os._exit () est utilisé, si le processus est tué de manière agressive ou si la machine redémarre. (Bien sûr, le dernier élément ne pose pas de problème dans votre cas.) Si votre processus est sujet à des collisions (il utilise des modules d'extension tiers instables, par exemple), vous pouvez effectuer le nettoyage dans un processus parent simple. plus d'isolement.

Si vous n'êtes pas vraiment inquiet, utilisez le module atexit.

Application Wide Handler est correct. Ils sont parfaits pour la journalisation. Assurez-vous simplement que l'application la plus large est durable et ne risque pas de se planter d'elle-même.

si vous utilisez des classes, vous devez bien sûr libérer les ressources allouées dans leurs destructeurs. Utilisez try: sur l’ensemble de l’application si vous souhaitez libérer des ressources qui ne sont pas encore libérées par les destructeurs de vos classes.

Et au lieu d'utiliser un fourre-tout sauf:, vous devriez utiliser le bloc suivant:

try:
    main()
finally:
    cleanup()

Cela assurera un nettoyage plus pythonique.

Cela semble être une approche raisonnable, et plus simple et fiable qu'un destructeur sur une classe singleton. Vous pouvez également consulter le " atexit " module. (Prononcé "à la sortie", pas "un texte" ou quelque chose du genre. J'ai confondu cela pendant longtemps.)

Envisagez d'écrire un gestionnaire de contexte et d'utiliser l'instruction with.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top