4

プログラムの終了時に子プロセスを強制終了する機能があります。

class MySingleton:
    def __init__(self):
        import atexit
        atexit.register(self.stop)

    def stop(self):
        os.kill(self.sel_server_pid, signal.SIGTERM)

ただし、この関数が呼び出されるとエラー メッセージが表示されます。

Traceback (most recent call last):
File "/usr/lib/python2.5/atexit.py", line 24, in _run_exitfuncs
   func(*targs, **kargs)
File "/home/commando/Development/Diploma/streaminatr/stream/selenium_tests.py", line 66, in stop
   os.kill(self.sel_server_pid, signal.SIGTERM)
AttributeError: 'NoneType' object has no attribute 'kill'

ossignalモジュールatexitが呼び出される前にアンロードされるようです。それらを再インポートすると問題は解決しますが、この動作は奇妙に思えます。これらのモジュールはハンドラーを登録する前にインポートされるのに、なぜ自分の終了ハンドラーが実行される前にアンロードされるのでしょうか?

4

1 に答える 1

9

プログラムの終了時に破棄される順序について強い保証はありませんatexit。たとえば、あなたの場合:

class MySingleton:
    def __init__(self):
        import atexit
        atexit.register(self.stop)
        self._dokill = os.kill
        self._thesig = signal.SIGTERM

    def stop(self):
        self._dokill(self.sel_server_pid, self._thesig)

これは、モジュールを再インポートするよりも望ましい方法です (これにより、プログラムの終了速度が低下したり、無限ループが発生したりする可能性がありますが、 などの「システムが提供する」モジュールの場合、そのリスクは小さくなりますos)。

于 2010-04-03T18:15:34.593 に答える