1. ホーム
  2. python

[解決済み] Pythonのスレッド内でsys.exit()が呼び出されたときに終了しないのはなぜですか?

2022-09-30 23:28:51

質問

これは愚かな質問かもしれませんが、私はPythonに関するいくつかの仮定をテストしており、以下のコードスニペットがスレッドで呼び出されたときに終了せず、メインスレッドで呼び出されたときに終了する理由について混乱しています。

import sys, time
from threading import Thread

def testexit():
    time.sleep(5)
    sys.exit()
    print "post thread exit"

t = Thread(target = testexit)
t.start()
t.join()
print "pre main exit, post thread exit"
sys.exit()
print "post main exit"

sys.exit()のドキュメントには、呼び出しがPythonから終了するようにと書かれています。私はこのプログラムの出力から、"post thread exit" が決して出力されないことを見ることができますが、メインスレッドはスレッドが exit を呼び出した後でもただ進み続けています。

インタープリタの個別のインスタンスが各スレッドに対して作成され、exit() の呼び出しはその個別のインスタンスを終了させているだけでしょうか。もしそうなら、スレッド化実装は共有リソースへのアクセスをどのように管理するのでしょうか。もし私がスレッドからプログラムを終了したい場合 (実際に終了したいわけではありませんが、私が理解できるように) はどうすればよいでしょうか?

どのように解決するのですか?

sys.exit()SystemExit と同様に例外が発生します。 thread.exit() . そのため sys.exit() がそのスレッド内で例外を発生させると、そのスレッドで thread.exit() を呼び出すのと同じ効果があり、そのためそのスレッドだけが終了します。