マルチプロセッシングによって開始されたプロセスは正常に終了せず、atexit
関数は呼び出されません。次のように、try/finally ブロックを介して手動でクリーンアップを実行する必要があります。
def worker():
try:
print('Doing some work')
finally:
final()
または、本当に使用したい場合atexit
(欠点については以下を参照):
def worker():
try:
print('Doing some work')
finally:
atexit._run_exitfuncs()
サブプロセスが正常に終了しないのはなぜですか?
技術的には、を介して終了するos._exit()
ため、クリーンアップ ジョブ (atexit
関数、__del__()
weakref ファイナライザーを含む) をスキップします。
この決定の背後にある理由は、クリーンアップが間違ったタイミングで間違ったプロセスで実行されるリスクがあるためです。(または他のメカニズム)を使用するコードのほとんどはatexit
、メイン インタープリターが終了するときにのみ、コードが 1 回だけ実行されることを想定しています (たとえば、atexit
一時ディレクトリを削除するために使用する場合があります)。atexit
サブプロセスが終了するたびに関数を実行すると、この期待が崩れ、悪いことが起こる可能性があります。
atexit
そのため、を介して関数を実行することはできますがatexit._run_exitfuncs()
、関数が文書化されていないことと、 の唯一のユーザーではない可能性があるためatexit
(他のサードパーティ ライブラリがそれを使用している可能性があり、コードにバグを導入する可能性があるため)、そうすることは避けてください)。