7.4 組み込みモジュール thread
このモジュールは複数のスレッド(いわゆるライトウエイトプロセス または
タスク)を扱うための基本関数を提供します。つまりグローバルデータスペースを共有する複数のスレッドを扱います。同期のために単純なロック(いわゆる
ミューテックスまたはバイナリセマフォ)が提供されています。
このモジュールはオプションです。これはWindows NTと'95、SGI、IRIX、Solaris 2.x、
およびPOSIXスレッド(いわゆる``pthread'')を実装しているシステムでサポートされています。
以下の定数と関数を定義しています。
- error
-
スレッド固有のエラーで発生します。
- start_new_thread (func, arg)
-
新しいスレッドを開始します。そのスレッドは関数funcを引数リスト
arg(タプルでなければなりません)で実行します。関数がリターンしたときは
そのスレッドは黙って終了します。関数が処理されなかった例外で終了すると、
スタックトレースが表示され、そのスレッドは終了します(しかし他のスレッドは
走り続けます)。
- exit ()
-
これはexit_thread()に対する簡略形です。
- exit_thread ()
-
SystemExit例外を発生させます。これがキャッチされない場合は、
そのスレッドは黙って終了させられます。
- allocate_lock ()
-
新しいロックオブジェクトを返します。ロックのメソッドは以下に記述されています。
ロックは初めはロックされていません。
- get_ident ()
-
現在のスレッドの'スレッド識別子'を返します。これは0でない整数です。
この値は直接的な意味を持ってはいません。つまりこれはスレッド固有データの
辞書をインデックスするため等に使われるマジッククッキーのようなものです。
スレッド識別子はスレッドが終了し他のスレッドが生成されたときに再利用される
かもしれません。
ロックオブジェクトは以下のメソッドを持っています。
- acquire ([waitflag])
-
オプションの引数がなければ、このメソッドはロックを無条件に取得します。
そのロックが他のスレッドによって開放されるまで待つ必要があれば
(一度にひとつのスレッドのみがロックを取得できます。これがロックの存在理由です)、Noneを返します。整数のwaitflag引数があれば、動作はその値に
依存します。つまり、0の場合は、待たずにすぐ取得できれるときのみロックは取得
され、0以外の場合は、前のように無条件にロックは取得されます。
引数があれば、ロックの取得に成功すると戻り値は1になり、失敗すると
0になります。
- release ()
-
ロックを開放します。そのロックは既に取得されたものでなければなりませんが、
同じスレッドで取得されたものである必要はありません。
- locked ()
-
ロックの状態を返します。同じスレッドで取得されたものであれば1、
そうでなければ0です。
警告:
-
スレッドは割り込みと奇妙に相互作用します。つまり、KeyboardInterrupt
例外は任意のスレッドによって受け取られます。
(signal モジュールが利用可能であれば、
割り込みは常にメインスレッドで受け取られます。)
-
sys.exit()を呼び出すことまたはSystemExit例外を発生させること
はexit_thread()を呼び出すことと同じです。
-
I/O待ちをさまたげる可能性のあるすべての組み込み関数が他のスレッドの
走行を許すわけではありません。(ほとんどの一般的な関数
(time.sleep(),file.read(), select.select())
は期待通りに働きます。)
-
ロックのacquire()メソッドに割り込みを入れることはできません。
つまり、KeyboardInterrupt例外はロックが取得された後で発生します。
-
メインスレッドが終了したとき他のスレッドが生き残るかどうかはシステムによります。
ネイティブのスレッド実装を使うSGI IRIX上では、それらは生き残ります。
その他の大抵のシステムではtry ... finally節を実行したり
オブジェクトのデストラクタを実行したりせずにそれらはkillされます。
-
メインスレッドが終了したとき、その通常のクリーンアップは行われず
(try ... finally節が与えられている場合は除きます)、
標準I/Oファイルはフラッシュされません。
guido@python.org