2016-08-06 13 views
7

私はsys.exit()にPythonで混乱しました。 python documentationには、「Exit from Python」と書かれています。それは、sys.exit()がpythonプログラムで呼び出されたときに、プロセスは終了しますか?その場合は、以下のコードは異なる結果を示しています。sys.exitは実際に複数のスレッドで何をしますか?

import sys 
import time 
import threading 

def threadrun(): 
    while(True): 
     time.sleep(1) 

if __name__=="__main__": 
    t=threading.Thread(target=threadrun) 
    t.start() 
    sys.exit() 

は、Linuxでこのプログラムを起動し、結果はPythonドキュメントが言うように期待されるものではありませんでしたが、それでもシステムで実行されるのでsys.exit()は本当に何をするのでしょうか?

+0

スレッドが終了するのを待つ、スレッドが終了しないので、スレッドが強制的にスレッドを停止することを期待していたのですか? –

+0

私はそれを得ました、とにかくありがとう! – wdy

答えて

1

簡単です。

あなたの場合、プログラムの最後は最後のスレッドが終了する時です。多分join()メソッド(Javaのように)はPythonで他のスレッドを待つでしょう。 while(true)に時間の有限の方法を変更することができます。

def threadrun(): 
i=1000_000_000_000 
    while(i>0): 
     i=i-1 
     time.sleep(1) 

他のプログラムの動作を監視する。私の英語のため申し訳ありません事前に

(:

としてください、(この記事を読んで:あなたのケース内のスレッド Use of threading.Thread.join()

ドキュメントと遊ぶのがどのように良い説明があり https://docs.python.org/2/library/threading.html(しかし、リラックスして、それは付加的な知識のためです。

この記事ではデーモンのプロパティについて読んでいます。 R他のスレッドは、ドキュメントsys.exit() 1として Python thread daemon property

5

を終了となっSystemExit提起:SystemExitを(ステータス)を上げることによって

出口通訳を。

SystemExitdefault exception handlerに達した場合、 そうsys.exit()が正常がの底から落ちると同じであり、順番にパイソン2 wait_for_thread_shutdown()を呼び出しており、多かれ少なかれPy_Finalize()を介して押圧する、handle_system_exit()を呼び出しメインモジュールはデーモンではないすべてのスレッドが終了するのを待っています。

+0

これらのリンクはすべて壊れています。私はこれは良い答えだと思いますが、あなたのすべてのリンクが何を指しているのか分かりません。 – tmastny

+1

@ tmastnyそうしたリンクを修正しましょう。もう一度チェックしてください。不思議なことに、それらはギタプ "パーマリンク"でした。 – dhke

+0

彼らはすべて私のために働いています。そして、 'wait_for_threat_shutdown'リンクが私の質問に答えました! – tmastny

2

はランニングを残しているデーモンスレッド(そのものを無視して)が、何もない場合にのみ、通常のPythonプログラムが終了Thread Objects

のドキュメントに何言い換え。プログラムの制御の最初のスレッドに対応する「メインスレッド」オブジェクトは、デーモンスレッドではありません。 threading.Threadを使用して作成されたスレッドは、作成中のスレッドからデーモンのステータスを継承します。そのスレッドがメインスレッドであれば、デーモンではありません。

これは、メインスレッドが(sys.exit()、と言うことで、または単にちょうどの終わりを押すことで終了したとき、彼らはまだ実行されている場合、デフォルトによってがあなたのメインプログラムによって作成され、開始されたスレッドが終了するのを防ぐことを意味しますコード)。言い換えれば、プログラムは、生きていないデーモン以外のスレッドが残っているときだけ終了します。

あなたが明示的に下記のショーとして、それを開始するTrueに任意の作成したスレッドオブジェクトのdaemonプロパティを設定することで、このデフォルトの動作をオーバーライドすることができますときsys.exit()プログラムが実際に終了することができます

 ... 

if __name__=="__main__": 
    t = threading.Thread(target=threadrun) 
    t.daemon = True # added 
    t.start() 
    sys.exit() 

(とにかくそれがスクリプトの最後にあるので、それを明示的に呼び出すことは必要ではないが、明示的に呼び出すこともできるが)。

関連する問題