12

簡単に言うと、Linux で "losetup" や "mount" などのアウトコールを実行する実質的な Python アプリケーションがあります。完了時に解放する必要があるシステム リソースを本質的に消費します。

アプリケーションがクラッシュした場合、これらのシステム リソースが適切に解放されるようにしたいと考えています。

次のようなことをするのは理にかなっていますか?

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

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

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

これは通常行われていることですか?より良い方法はありますか?おそらく、シングルトン クラスのデストラクタでしょうか。

4

6 に答える 6

11

私は一般的に (言語に関係なく) トップレベルの例外ハンドラーが好きです。これらは、例外をスローするメソッド内で消費されるリソースに直接関係しないリソースをクリーンアップするのに最適な場所です。

また、そのようなフレームワークが整っている場合、これらの例外をログに記録するのに最適な場所です。トップレベルのハンドラーは、計画していなかった奇妙な例外をキャッチし、将来修正できるようにします。

トップレベルのハンドラーが例外をスローしないように注意してください!

于 2008-09-18T18:55:38.120 に答える
7

(__del__ メソッドのような) デストラクタは、呼び出されることが保証されていないため、悪い考えです。atexit モジュールはより安全なアプローチですが、Python インタープリターが (Python アプリケーションではなく) クラッシュした場合、または os._exit() が使用された場合、またはプロセスが積極的に強制終了された場合、またはマシンが再起動した場合でも、これらは起動しません。(もちろん、あなたの場合、最後の項目は問題ではありません。) プロセスがクラッシュしやすい場合 (たとえば、気まぐれなサードパーティの拡張モジュールを使用している場合)、単純な親プロセスでクリーンアップを実行することをお勧めします。より多くの分離。

特に心配ない場合は、atexit モジュールを使用してください。

于 2008-09-18T18:56:07.933 に答える
2

アプリケーション全体のハンドラーは問題ありません。それらはロギングに最適です。アプリケーション全体が耐久性があり、それ自体がクラッシュする可能性が低いことを確認してください。

于 2008-09-18T18:54:18.623 に答える
2

もちろん、クラスを使用する場合は、代わりにデストラクタで割り当てられたリソースを解放する必要があります。クラスのデストラクタによってまだ解放されていないリソースを解放したい場合にのみ、アプリケーション全体で try: を使用してください。

また、キャッチオール except: を使用する代わりに、次のブロックを使用する必要があります。

try:
    main()
finally:
    cleanup()

これにより、よりpythonicな方法でクリーンアップが保証されます。

于 2008-09-18T23:45:15.290 に答える
1

これは合理的なアプローチのようで、シングルトン クラスのデストラクタよりも簡単で信頼性があります。「 atexit」モジュールも参照してください。(「a tex it」などではなく、「at exit」と発音します。長い間混乱していました。)

于 2008-09-18T18:56:44.717 に答える
1

コンテキスト マネージャーを作成し、 with ステートメントを使用することを検討してください。

于 2008-09-23T10:26:25.297 に答える