# 7.5 `threading` -- 高レベルスレッドインターフェース

このモジュールは、低レベルな`thread`モジュールの上に、 高レベルスレッドインターフェースを構築しています。

`thread`が存在しないために `threading` を利用できない場合、 代わりにrefmodule[dummythreading]dummy_threadingを使用することができます。

関数とオブジェクトは次のように定義されています:

`activeCount`( | )

  現在のアクティブな`Thread`オブジェクトの数を返します。 この返された数は、`enumerate()`から返されるリストの長さと等しいです。 現在のアクティブなスレッドの数を返す関数です。

`Condition`( | )

  新しい条件変数オブジェクトを返すファクトリー関数です。 条件変数は、一つ以上のスレッドが他のスレッドによって通知されるまで 待つことを許します。

`currentThread`( | )

  呼んだ関数のスレッドに相当する、現在の`Thread`オブジェクトを返します。 その関数のスレッドが`threading`モジュールを使って作られていなければ、 機能を制限したダミースレッドオブジェクトが返されます。

`enumerate`( | )

  現在のすべてのアクティブ`Thread`オブジェクトのリストを返します。 このリストは、デーモンスレッド(`currentThread()`によって作られた ダミースレッドオブジェクト)と、メインスレッドを含みます。 このリストは、ターミネートしたスレッドと、 まだ開始していないスレッドを除きます。

`Event`( | )

  新しいイベントオブジェクトを返すファクトリー関数です。 イベントは、`set()`メソッドでTrueにセットでき、 `clear()`メソッドでFalseにリセットできるフラグを扱います。 `wait()`メソッドは、フラグがTrueになるまでブロックします。

`Lock`( | )

  新しいプリミティブロックオブジェクトを返すファクトリー関数です。 いったんスレッドがロックを獲得すると、 それが解放されるまで次の獲得試行をブロックします; どのスレッドがそれを解放してもかまいません。

`RLock`( | )

  新しい再入可能ロックオブジェクトを返すファクトリー関数です。 再入可能ロックはそれを獲得したスレッドによって解放されなければなりません。 いったんスレッドが再入可能ロックを獲得すると、 同じスレッドはブロックされずにもう一度それを獲得できます; そのスレッドは獲得した回数だけ解放しなければいけません。

`Semaphore`( | [value])

  新しいセマフォオブジェクトを返すファクトリー関数です。 セマフォは、`release()`を呼び出した数から、 `acquire()`を呼び出した数を引いて、 初期値を足した数を反映するカウンターを扱います。 `acquire()`メソッドは、カウンターが負にならずに返ることができるまで、 ブロックします。 もしvalueが与えられなかったら、デフォルトに1を使います。

`BoundedSemaphore`( | [value])

  新しい有限セマフォオブジェクトを返すファクトリー関数です。 有限セマフォは、現在値が初期値を超過することを阻止します。 もし超過した場合、`ValueError`が投げられます。 ほとんどの状況で、セマフォは限りある容量しかもたない資源を 保護するために使用されます。 セマフォがあまりにも何度も解放される場合、それはバグの表れです。 もしvalueが与えられなかったら、デフォルトに1を使います。

class `Thread`
  制御しているスレッドを表すクラスです。 このクラスは制限のある範囲内で安全にサブクラス化できます。

class `Timer`
  指定した時間が経過しか後に、関数を実行するスレッドです。

`settrace`( | func)

  `threading` モジュールで開始された全てのスレッドに トレース関数 を設定します。 func は各スレッドの `run()` が呼び出される以前に `sys.settrace()` に渡されます。 バージョン2.3 以降で新規追加された 仕様です。

`setprofile`( | func)

  `threading` モジュールで開始された全てのスレッドに プロファイル関数 を設定します。 func は各スレッドの `run()` が呼び出される以前に `sys.settrace()` に渡されます。 バージョン2.3 以降で新規追加された 仕様です。

オブジェクトの詳細なインターフェースを以下に説明します。

このモジュールのデザインはJavaスレッドモデルを適当に使いました。しかし、 Javaはロックと条件変数をすべてのオブジェクトの基本的な振舞いにしましたが、 Pythonではそれらは独立したオブジェクトです。Pythonの`Thread`クラス はJavaスレッドクラスの振舞いのサブセットを提供します; 現在、優先スレッド、 スレッドグループはありません。スレッドのdestroy,stop,suspend,resume, interruptなどはできません。Javaスレッドクラスのstaticメソッドは、実装され たときに、モジュールレベルの関数にマップされています。

以下に記述された全てのメソッドはアトミックに実行されます。