0

Pythonプロセスのメインスレッドがシャットダウンされたとき(通常は、キャッチされない例外を指定して)、関数を実行する方法はありますか?メインスレッドはどのようにファイナライズするのですか?

私はatexit.registerは、その機能を提供するだろう期待していたが、メインスレッドが終了したとき、明らかにそれが呼び出されない - 場合にのみ、終了したすべてのスレッド。だから、このコードは意図したとおりに動作しません:私はそれが終了する前に、自分自身後にクリーンアップする機会を持ちたいので

import atexit 
import threading 

done = False 

def stop_child_thread(): 
    global done 
    done = True 

def child_thread(): 
    while not done: 
     pass 

atexit.register(stop_child_thread) 
t = threading.Thread(target=child_thread) 
t.start() 

私はデーモンスレッドとして子スレッドを起動する必要はありません。

ここで私が考えることのできる唯一の解決策は、メインスレッドがまだ生きているかどうかを(子スレッドか専用スレッドか)定期的にチェックし、必要でない場合は実行することです。

答えて

1

ひとつのアイデアは、別のスレッドjoinメインスレッドを持つようになり、その後、クリーンアップするだろう:

def cleanup_on_main_thread_exit(): 
    threading.main_thread().join() 
    do_whatever() 

threading.Thread(target=cleanup_on_main_thread_exit).start() 
+0

Thxをし、これは私が私の質問に示した簡単な設定で動作しているようです - それは、ポーリングよりはましです私は使用する予定だった。残念なことに、何らかの形で実際のコードでは、わずかな不具合が発生します。すべてのスレッドが正常に完了したにもかかわらず、Pythonインタプリタが生き残っているようです。 CTRL-Cで簡単に停止できます。私は何が起こっているのか分かりませんし、小さな例でそれを再現することはできません。おそらく、Pythonインタプリタの終了メカニズムが混乱します。 – max

関連する問題