生まれた子プロセスによって登録のatexitハンドラー継承されていますか?
-
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))
あなたの代わりにあなたの元のバージョンでそれが動作する必要があることを取る場合。でも、私は、サブプロセスでそれをテストしていません。