15.2 thread -- マルチスレッドのコントロール

このモジュールはマルチスレッド(別名 軽量プロセス (light-weight processes)またはタスク(tasks)) に用いられる低レベルプリミティブを提供します -- グローバルデータ空間を共有するマルチスレッドを制御します。 同期のための単純なロック(別名 mutexesまたは バイナリセマフォ(binary semaphores))が提供されています。

このモジュールはオプションです。 Windows, Linux, SGI IRIX, Solaris 2.x、そして同じようなPOSIXスレッド (別名``pthread'')実装のシステム上でサポートされます。 threadを使用することのできないシステムでは、 dummy_threadが用意されています。 dummy_threadはこのモジュールと同じインターフェース を持ち、置き換えて使用することができます。

定数と関数は以下のように定義されています:

exception error
スレッド特有のエラーで送出されます。

LockType
これはロックオブジェクトのタイプです。

start_new_thread( function, args[, kwargs])
新しいスレッドを開始して、そのIDを返します。 スレッドは引数リストargs(タプルでなければなりません)の 関数functionを実行します。 オプション引数kwargsはキーワード引数の辞書を指定します。 関数が戻るとき、スレッドは黙って終了します。 関数が未定義の例外でターミネートしたとき、スタックトレースが表示され、 そしてスレッドが終了します(しかし他のスレッドは走り続けます)。

interrupt_main( )
メインスレッドで KeyboardInterrupt を送出します。サブスレッドは この関数を使ってメインスレッドに割り込みをかけることができます。 バージョン 2.3 で 新たに追加 された仕様です。

exit( )
SystemExit例外を送出します。 それが捕えられないときは、黙ってスレッドを終了させます。

allocate_lock( )
新しいロックオブジェクトを返します。 ロックのメソッドはこの後に記述されます。 ロックは初期状態としてアンロック状態です。

get_ident( )
現在のスレッドの`スレッドID'を返します。 これは0でない整数です。 この値は直接の意味を持っていません; 例えばスレッド特有のデータの辞書に索引をつけるためのような、 マジッククッキーとして意図されています。 スレッドが終了し、他のスレッドが作られたとき、 スレッドIDは再利用されるかもしれません。

stack_size( [size])
新しいスレッドが作られる際に使われるスレッドのスタックサイズを返します。 オプションの size 引数は次に作られるスレッドに対する スタックサイズを指定するものですが、0 (プラットフォームまたは設定されたデフォルト) または少なくとも 32,768 (32kB) であるような正の整数でなければなりません。 もしスタックサイズの変更がサポートされていなければ ThreadError が送出されます。また指定されたスタックサイズが条件を満たしていなければ ValueError が送出されスタックサイズは変更されないままになります。 32kB は今のところインタプリタ自体に十分なスタックスペースを保証するための値として サポートされる最小のスタックサイズです。プラットフォームによってはスタックサイズの 値に固有の制限が課されることもあります。たとえば 32kB より大きな最小スタックサイズを 要求されたり、システムメモリサイズの倍数の割り当てを要求されるなどです - より 詳しい情報はプラットフォームごとの文書で確認してください(4kB ページは一般的ですので、 情報が見当たらないときには 4096 の倍数を指定しておくといいかもしれません)。 利用可能: Windows, POSIX スレッドのあるシステム。 バージョン 2.5 で 新たに追加 された仕様です。

ロックオブジェクトは次のようなメソッドを持っています:

acquire( [waitflag])
オプションの引数なしで使用すると、このメソッドは他のスレッドがロックし ているかどうかにかかわらずロックを獲得します。 ただし他のスレッドがすでにロックしている場合には解除されるまで 待ってからロックを獲得します (同時にロックを獲得できるスレッドは ひとつだけであり、これこそがロックの存在理由です)。 整数の引数 waitflag を指定すると、その値によって動作が変わります。 引数が 0 のときは、待たずにすぐ獲得できる場合にだけロックを獲得 します。0 以外の値を与えると、先の例と同様、ロックの状態に かかわらず獲得をおこないます。なお、ロックを獲得すると True、できなかったときには False を返します。

release( )
ロックを解放します。そのロックは既に獲得されたものでなければなりませんが、 しかし同じスレッドによって獲得されたものである必要はありません。

locked( )
ロックの状態を返します: 同じスレッドによって獲得されたものならTrue、 違うのならFalseを返します。

これらのメソッドに加えて、ロックオブジェクトは with 文を通じて 以下の例のように使うこともできます。

from __future__ import with_statement
import thread

a_lock = thread.allocate_lock()

with a_lock:
    print "a_lock is locked while this executes"

Caveats:

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