生まれた子プロセスによって登録のatexitハンドラー継承されていますか?

StackOverflow https://stackoverflow.com/questions/1052716

  •  20-08-2019
  •  | 
  •  

質問

私は、Python 2.5を使用してデーモンプログラムを書いています。終了ハンドラは、モジュールatexitに登録されている主なプロセスでは、を、それぞれの子プロセスは、私が期待されていない、終了時ハンドラが呼び出されることをのようです。

私は、誰もが問題を知っている、この動作は<=> pythonでドキュメントを言及されていない気づきましたか?これは、それがどのように振る舞うべきかである場合には、どのように私は子供のプロセスで終了ハンドラの登録を解除することができますか?そこバージョン3.0でatexit.unregisterはあるが、私は2.5を使用しています。

役に立ちましたか?

解決

はPython 2.5でそれを行うためのAPIはありませんが、あなたができるだけます:

import atexit
atexit._exithandlers = []

あなたの子プロセスで - あなたが知っていればあなたが唯一の終了ハンドラがインストールされている、および他のハンドラがインストールされていないこと。しかし、STDLIB(例えばlogging)の一部がatexitハンドラを登録することに注意してください。その上で踏みつけないようにするには、試みることができる:

my_handler_entries = [e for e in atexit._exithandlers if e[0] == my_handler_func]
for e in my_handler_entries:
    atexit._exithandlers.remove(e)

ここでmy_handler_func <=>ハンドラあなたが登録されており、これは他の人を削除せずに自分のエントリを削除する必要があります。

他のヒント

当然の登録終了関数だけでなく、他のすべてのコードとデータ構造を含む - あなたは子プロセスを作るためにfork場合は、

、その子は親の正確なコピーです。私はそれはあなたが見ている問題だと考えている - 。それは、必ずしもすべての単一のものに適用されるので、もちろんそれはそれぞれ、すべてのモジュールに言及していない

atexit.register()基本的にatexit._exithandlersによって呼び出される関数のモジュール私的リストであるsys.exitfunc()、中にあなたの関数を登録します。あなたは、子のステータスをチェックするカスタム作られた終了ハンドラ関数にexitfunc()設定するか、単に登録を解除することができます。何ちょうどあなたのローカルソースツリーに3.0 atexit.pyをコピーし、代わりにそれを使用してはどうですか?

編集:私は私の2.6バージョンからatexit.pyをコピーし、

で、それを拡張
def unregister(func, *targs, **kargs):
    _exithandlers.remove((func, targs, kargs))

あなたの代わりにあなたの元のバージョンでそれが動作する必要があることを取る場合。でも、私は、サブプロセスでそれをテストしていません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top