2017-11-04 8 views
1

私は長いプログラムにスレッドがたくさんあります。私は問題の内容を正確に見ることができるサンプルの短いコードを作成しました。Pythonのメインスレッド

from threading import Thread, active_count 
import time 

def func(x): 
    time.sleep(x) 
    print(active_count()) 

print(active_count()) 
t = Thread(target=func, name="thread", args=(5,)) 
t.start() 
print("main thread finished") 

簡単に言えば - 最後のprint文が実行された後でもメインスレッドがまだアクティブな理由はわかりません。

  1. Iは、第一の印刷ステートメントは、番号1印刷
  2. 関数funcを定義 - アクティブなスレッドの数。スレッドtがまだ起動されていないので、番号1が正しい(メインスレッドのみ)
  3. スレッドtを定義して実行しました。
  4. スレッドtが眠っている間、メインスレッドが最後のprint文を終え、スレッドtが覚醒し、現在アクティブなスレッドの数を表示します しかし
  5. を完了する必要があり - そして数は2である - 両方のメインスレッドとスレッドtは、メインスレッドが既に終了しているはずなので、(最後のprint文)がすでに印刷されているので、(Pythonによると)アクティブになります。

メインスレッドの背後にあるメカニズムと他のスレッドとのメカニズムは何ですか?ありがとう

+2

nopeでは、メインスレッドは、joinを使用していなくても、すべてのスレッドが終了するのを待ちます。 –

答えて

1

Cのような言語をコンパイルするために使用する必要があります。メインルーチンを終了するとすべてが終了します。

Pythonでは、メインスレッドの最後に到達しても他のスレッドは破棄されません。

実際にスレッドを破棄することはできません。これは共同作業でなければなりません(例:フラグを設定するかスレッドがループを終了するようにスレッドを理解するようにイベントを送信する必要があります。その間にフラグがあるかどうかを確認してください)。

メインスレッドの実行が終了すると、Pythonインタプリタはすべてのスレッドが終了するのを待って終了します。

joinメソッド(t.start())を使用してこの待機を実現する方がはるかに良いことに注意してください。あなたはそれを開始する前に、デーモンとして、あなたのスレッドをマークする必要が望むものを達成するために

1

t = Thread(...) 
t.daemon = True 
t.start() 

ドキュメントhttps://docs.python.org/2/library/threading.html#thread-objectsを参照してください:

スレッドは「デーモンスレッド」としてフラグを設定することができます。このフラグの意味は、デーモンスレッドだけが残っているとPythonプログラム全体が終了することです。

メインスレッドはデーモンではないため、作成したスレッドをデーモンとしてマークすると、メインスレッドが終了するとすぐにプログラムを終了できます。

関連する問題