2013-10-06 3 views
10

http://docs.python.org/2/library/threadメインスレッドがsys.exit()を呼び出すと、他のスレッドはどうなりますか?ドキュメントから

他 のスレッドが生き残るかどうか、メインスレッドが終了、それは定義されたシステムです。ネイティブスレッド実装を使用するSGI IRIXでは、 が存続します。他のほとんどのシステムでは try ... finallyを実行したり、オブジェクトデストラクタを実行したりせずにそれらを強制終了します。

そしてここで、ドキュメント(http://docs.python.org/2/library/threading)で、それは言う:

スレッドは「デーモンスレッド」としてフラグを設定することができます。この フラグの意味は、デーモンスレッド だけが残っていると、Pythonプログラム全体が終了するということです。初期値は作成スレッドから継承されます。

ここではデーモンではないスレッドについてのみ説明します。最初の引用は非デーモンスレッドを特別に参照するものではないので、メインスレッドが終了していなければ非デーモンスレッドであっても殺さなければならないと思います。しかし、2番目の引用はそうでないことを示唆している。実際、メインスレッドが終了すると、デーモン以外のスレッドは実際には殺されません。では、ここで最初に引用するのは何ですか?

+0

コードを書いて試してみてください –

+2

'thread'モジュールはすべてをデーモンスレッドとして扱いますが、' threading'は「非デーモン」スレッドの概念を追加しているようです。 –

+0

@ user2799617:私はコードを書いて、「メインスレッドが終了したときに非デーモンスレッドが実際には殺されていない」という結論に達しました。だからこそ、私のシステムはおそらく最初の見積もりが当てはまるのか疑問に思っています。なぜなら私のシステムはおそらくそれらの「他のほとんどのシステム」の1つであるからです。Ubuntu 12.10 python 2.7を実行しています。 – gjain

答えて

8

参照するドキュメントは、の2つのモジュール(threadおよびthreading)から提供されています。 threadは、「スレッド」の意味に関するプラットフォームの考え方に多かれ少なかれ直接アクセスできる低レベルのモジュールです。 threadingはプラットフォーム依存性の少ない「スレッド」のより高いレベルの概念を提供します。

これは、ドキュメントが異なることを言う理由です。低レベルのthread「スレッド」終了時に起こることは、プラットフォームCのバージョンのスレッドが何をするかに依存しますが、いずれにせよ、Pythonはそれらをきれいにシャットダウンしようとしません。

threading.Threadが異なります。 Pythonの通常のシャットダウン処理の一部は、.join()以外のすべてのデーモンであるthreading.Threadスレッドです。だから、デーモン以外のデーモンthreading.Threadスレッドが終了するまで(つまり、確実にプログラマの責任である)プログラムが終了することはありません。低レベルのthreadモジュールスレッドは、.join()という概念を持たないことに注意してください。によっての異なるthreadingモジュールが実装された上位概念です。

アドバイス:代わりにthreadを使用する優れた理由がない限り、threadの代わりにthreadingを使用してください。 threadingはよりよく動作し、多くの便利なツールを提供します。 threadを使用した方が良いでしょうか?

注:Python 3では、下位レベルのthreadモジュールの名前が_threadに変更されました。いつものように、先頭のアンダースコアは「これを混乱させないほうがいいですが、必要ならばここにあります」と示唆しています。

関連する問題