15.3.6 Thread オブジェクト

このクラスは個別のスレッド中で実行される活動 (activity) を表現します。 活動を決める方法はは 2 つあり、一つは呼出し可能オブジェクトを コンストラクタへ渡す方法、もう一つはサブクラスでrun() メソッドを オーバライドする方法です。(コンストラクタを除く) その他のメソッドは 一切サブクラスでオーバライドしてはなりません。言い換えるならば、 このクラスの__init__()run()メソッドだけを オーバライドしてくださいということです。

ひとたびスレッドオブジェクトを生成すると、スレッドのstart() メソッドを呼び出して活動を開始せねばなりません。start() メソッドはそれぞれのスレッドの run() メソッドを起動します。

スレッドの活動が始まると、スレッドは '生存中 (alive)' で、 '活動中 (active)' とみなされます (これら二つの概念はほとんど 同じですが、全く同じというわけではありません; これら二つは意図的に 曖昧に定義されているのです)。 スレッドの活動は、通常終了、あるいは処理されない例外が送出されたことで run() メソッドが終了すると生存中でなくなり、かつ活動中で なくなります。isAlive() メソッドはスレッドが生存中であるか どうか調べます。

他のスレッドはスレッドの join() メソッドを呼び出せます。 このメソッドは、join() を呼び出されたスレッドが終了するまで、 メソッドの呼び出し手となるスレッドをブロックします。

スレッドには名前があります。名前はコンストラクタで渡したり、 setName() メソッドで設定したり、getName() メソッドで取得したりできます。

スレッドには ``デーモンスレッド (daemon thread)'' であるというフラグを 立てられます。 このフラグには、残っているスレッドがデーモンスレッドだけになった時に Python プログラム全体を終了させるという意味があります。フラグの初期値は スレッドを生成する側のスレッドから継承します。フラグの値は setDaemon()メソッドで設定でき、isDaemon()メソッドで 取得できます。

スレッドには ``主スレッド (main thread)'' オブジェクトがあります。 主スレッドは Python プログラムを最初に制御していたスレッドです。 主スレッドはデーモンスレッドではありません。

``ダミースレッド (dumm thread)'' オブジェクトを作成できる場合があります。 ダミースレッドは、 ``外来スレッド (alien thread)'' に相当する スレッドオブジェクトです。ダミースレッドは、C コードから直接生成された スレッドのような、 threading モジュールの外で開始された 処理スレッドです。ダミースレッドオブジェクトには限られた機能しかなく、 常に生存中、活動中かつデーモンスレッドであるとみなされ、join() できません。また、外来スレッドの終了を検出するのは不可能なので、 ダミースレッドは削除できません。

クラス Thread( group=None, target=None, name=None, args=(), kwargs={})
コンストラクタは常にキーワード引数を使って呼び出さねばなりません。 各引数は以下の通りです:

groupNone にせねばなりません。 将来ThreadGroup クラスが実装されたときの拡張用に予約されている 引数です。

targetrun() メソッドによって起動される 呼出し可能オブジェクトです。 デフォルトでは何も呼び出さないことを示す None になっています。

nameはスレッドの名前です。デフォルトでは、 N を小さな 10 進数として、``Thread-N'' という形式の一意な名前を生成します。

argstarget を呼び出すときの引数タプルです。 デフォルトは()です。

kwargstarget を呼び出すときのキーワード引数の辞書です。 デフォルトは{}です。

サブクラスでコンストラクタをオーバライドした場合、 必ずスレッドが何かを始める前に基底クラスのコンストラクタ (Thread.__init__()) を呼び出しておかなくてはなりません。

start( )
スレッドの活動を開始します。

このメソッドは、スレッドオブジェクトあたり一度しか呼び出しては なりません。start() は、オブジェクトの run() メソッドが個別の処理スレッド中で呼び出されるように調整します。

run( )
スレッドの活動をもたらすメソッドです。

このメソッドはサブクラスでオーバライドできます。 標準のrun() メソッドでは、オブジェクトのコンストラクタの target 引数に呼び出し可能オブジェクトを指定した場合、 args およびkwargsの引数列およびキーワード引数とともに 呼び出します。

join( [timeout])
スレッドが終了するまで待機します。 このメソッドは、join() を呼び出されたスレッドが、 正常終了あるいは処理されない例外によって終了するか、オプションの タイムアウトが発生するまで、メソッドの呼び出し手となるスレッドを ブロックします。

timeout引数を指定して、None以外の値にする場合、 タイムアウトを秒 (または端数秒) を表す浮動小数点数でなければなりません。 join() はいつでも None を返すので、 isAlive() を呼び出してタイムアウトしたかどうかを確認しなければなりません。

timeout が指定されないかまたは None であるときは、 この操作はスレッドが終了するまでブロックします。

一つのスレッドに対して何度でも join() できます。

スレッドは自分自身をjoin() できません。デッドロックを引き起こす からです。

スレッドを開始するまえにjoin() を試みるのは誤りです。

getName( )
スレッドの名前を返します。

setName( name)
スレッドの名前を設定します。

名前は識別のためだけに使われます。名前には機能上の意味づけ (semantics) はありません。複数のスレッドに同じ名前をつけてもかまいません。 名前の初期値はコンストラクタで設定されます。

isAlive( )
スレッドが生存中かどうかを返します。

大雑把な言い方をすると、スレッドは start() メソッドを呼び出した 瞬間から run() メソッドが終了するまでの間生存しています。

isDaemon( )
スレッドのデーモンフラグを返します。

setDaemon( daemonic)
スレッドのデーモンフラグをブール値daemonic に設定します。 このメソッドは start() を呼び出す前に呼び出さねばなりません。

初期値は生成側のスレッドから継承されます。

デーモンでない活動中のスレッドが全てなくなると、Python プログラム全体 が終了します。

ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。