16.3。 スレッド —複数の制御スレッド
ノート
thread モジュールは、Python3で_thread
に名前が変更されました。 2to3 ツールは、ソースをPython 3に変換するときに、インポートを自動的に適応させます。 ただし、代わりに高レベルの threading モジュールの使用を検討する必要があります。
このモジュールは、複数のスレッド(軽量プロセスまたはタスクとも呼ばれます)(グローバルデータスペースを共有する複数の制御スレッド)を操作するための低レベルのプリミティブを提供します。 同期のために、単純なロック(ミューテックスまたはバイナリセマフォとも呼ばれます)が提供されます。 threading モジュールは、このモジュールの上に構築された、より使いやすく高レベルのスレッドAPIを提供します。
モジュールはオプションです。 これは、Windows、Linux、SGI IRIX、Solaris 2.x、およびPOSIXスレッド(別名 「pthread」)の実装。 thread モジュールがないシステムの場合は、 dumpy_thread モジュールを使用できます。 このモジュールのインターフェースを複製し、ドロップインの代替品として使用できます。
次の定数と関数を定義します。
- exception thread.error
- スレッド固有のエラーで発生します。
- thread.LockType
- これは、ロックオブジェクトのタイプです。
- thread.start_new_thread(function, args[, kwargs])
- 新しいスレッドを開始し、その識別子を返します。 スレッドは、引数リスト args (タプルである必要があります)を使用して関数 function を実行します。 オプションの kwargs 引数は、キーワード引数の辞書を指定します。 関数が戻ると、スレッドはサイレントに終了します。 関数が未処理の例外で終了すると、スタックトレースが出力され、スレッドが終了します(ただし、他のスレッドは引き続き実行されます)。
- thread.interrupt_main()
メインスレッドで
KeyboardInterrupt
例外を発生させます。 サブスレッドはこの関数を使用してメインスレッドに割り込むことができます。バージョン2.3の新機能。
- thread.exit()
SystemExit
例外を発生させます。 キャッチされていない場合、これによりスレッドはサイレントに終了します。
- thread.allocate_lock()
- 新しいロックオブジェクトを返します。 ロックの方法を以下に説明します。 ロックは最初にロック解除されます。
- thread.get_ident()
- 現在のスレッドの「スレッド識別子」を返します。 これはゼロ以外の整数です。 その値には直接的な意味はありません。 使用するマジッククッキーとして意図されています。 スレッド固有のデータのディクショナリにインデックスを付けます。 スレッド識別子は、スレッドが終了して別のスレッドが作成されたときにリサイクルされる場合があります。
- thread.stack_size([size])
新しいスレッドを作成するときに使用されるスレッドスタックサイズを返します。 オプションの size 引数は、後で作成されるスレッドに使用されるスタックサイズを指定し、0(プラットフォームまたは構成済みのデフォルトを使用)または少なくとも32,768(32kB)の正の整数値である必要があります。 size が指定されていない場合、0が使用されます。 スレッドスタックサイズの変更がサポートされていない場合、エラー例外が発生します。 指定されたスタックサイズが無効な場合、
ValueError
が発生し、スタックサイズは変更されません。 32kBは現在、インタプリタ自体に十分なスタックスペースを保証するためにサポートされている最小スタックサイズ値です。 一部のプラットフォームでは、32kBを超える最小スタックサイズが必要な場合や、システムメモリページサイズの倍数での割り当てが必要な場合など、スタックサイズの値に特定の制限がある場合があることに注意してください。詳細については、プラットフォームのドキュメントを参照してください(4kBページが一般的です)。 ;より具体的な情報がない場合は、スタックサイズに4096の倍数を使用することをお勧めします)。 可用性:Windows、POSIXスレッドを備えたシステム。バージョン2.5の新機能。
ロックオブジェクトには次のメソッドがあります。
- lock.acquire([waitflag])
- オプションの引数がない場合、このメソッドは無条件にロックを取得し、必要に応じて別のスレッドによって解放されるまで待機します(一度に1つのスレッドのみがロックを取得できます。これが存在理由です)。 整数 waitflag 引数が存在する場合、アクションはその値に依存します。ゼロの場合、ロックは待機せずにすぐに取得できる場合にのみ取得され、ゼロ以外の場合、ロックは取得されます。前と同じように無条件に。 ロックが正常に取得された場合、戻り値は
True
であり、そうでない場合はFalse
です。
- lock.release()
- ロックを解除します。 ロックは以前に取得されている必要がありますが、必ずしも同じスレッドによって取得されている必要はありません。
- lock.locked()
- ロックのステータスを返します。スレッドによって取得されている場合は
True
、そうでない場合はFalse
です。
これらのメソッドに加えて、ロックオブジェクトは with ステートメントを介して使用することもできます。例:
import thread
a_lock = thread.allocate_lock()
with a_lock:
print "a_lock is locked while this executes"
警告:
スレッドは割り込みと奇妙に相互作用します。
KeyboardInterrupt
例外は任意のスレッドによって受信されます。 ( signal モジュールが使用可能な場合、割り込みは常にメインスレッドに送られます。)sys.exit()を呼び出すか、
SystemExit
例外を発生させることは、 thread.exit()を呼び出すことと同じです。ロックで
acquire()
メソッドを中断することはできません—KeyboardInterrupt
例外は、ロックが取得された後に発生します。メインスレッドが終了すると、通常のクリーンアップは実行されず( try … finally 句が尊重されることを除いて)、標準I / Oファイルはフラッシュされません。