_thread —低レベルのスレッドAPI —Pythonドキュメント

提供:Dev Guides
< PythonPython/docs/3.9/library/ thread
移動先:案内検索

_thread —低レベルのスレッドAPI


このモジュールは、複数のスレッド(軽量プロセスまたはタスクとも呼ばれます)(グローバルデータスペースを共有する複数の制御スレッド)を操作するための低レベルのプリミティブを提供します。 同期のために、単純なロック(ミューテックスまたはバイナリセマフォとも呼ばれます)が提供されます。 threading モジュールは、このモジュールの上に構築された、より使いやすく高レベルのスレッドAPIを提供します。

バージョン3.7で変更:このモジュールはオプションでしたが、現在はいつでも利用できます。


このモジュールは、次の定数と関数を定義します。

exception _thread.error

スレッド固有のエラーで発生します。

バージョン3.3で変更:これは、組み込みの RuntimeError の同義語になりました。

_thread.LockType
これは、ロックオブジェクトのタイプです。
_thread.start_new_thread(function, args[, kwargs])

新しいスレッドを開始し、その識別子を返します。 スレッドは、引数リスト args (タプルである必要があります)を使用して関数 function を実行します。 オプションの kwargs 引数は、キーワード引数の辞書を指定します。

関数が戻ると、スレッドはサイレントに終了します。

関数が未処理の例外で終了すると、 sys.unraisablehook()が呼び出されて例外が処理されます。 フック引数の object 属性は function です。 デフォルトでは、スタックトレースが出力されてから、スレッドが終了します(ただし、他のスレッドは引き続き実行されます)。

関数が SystemExit 例外を発生させると、それは黙って無視されます。

バージョン3.8で変更: sys.unraisablehook()は、未処理の例外を処理するために使用されるようになりました。

_thread.interrupt_main()

メインスレッドに到着する signal.SIGINT シグナルの効果をシミュレートします。 スレッドはこの関数を使用してメインスレッドに割り込むことができます。

signal.SIGINT がPythonによって処理されない場合( signal.SIG_DFL または signal.SIG_IGN に設定されている場合)、この関数は何もしません。

_thread.exit()
SystemExit 例外を発生させます。 キャッチされていない場合、これによりスレッドはサイレントに終了します。
_thread.allocate_lock()
新しいロックオブジェクトを返します。 ロックの方法を以下に説明します。 ロックは最初にロック解除されます。
_thread.get_ident()
現在のスレッドの「スレッド識別子」を返します。 これはゼロ以外の整数です。 その値には直接的な意味はありません。 使用するマジッククッキーとして意図されています。 スレッド固有のデータのディクショナリにインデックスを付けます。 スレッド識別子は、スレッドが終了して別のスレッドが作成されたときにリサイクルされる場合があります。
_thread.get_native_id()

カーネルによって割り当てられた現在のスレッドのネイティブの整数スレッドIDを返します。 これは非負の整数です。 その値は、システム全体でこの特定のスレッドを一意に識別するために使用できます(スレッドが終了するまで、その後、値はOSによってリサイクルされる可能性があります)。

バージョン3.8の新機能。

_thread.stack_size([size])
新しいスレッドを作成するときに使用されるスレッドスタックサイズを返します。 オプションの size 引数は、後で作成されるスレッドに使用されるスタックサイズを指定し、0(プラットフォームまたは構成済みのデフォルトを使用)または少なくとも32,768(32 KiB)の正の整数値である必要があります。 size が指定されていない場合、0が使用されます。 スレッドスタックサイズの変更がサポートされていない場合、 RuntimeError が発生します。 指定されたスタックサイズが無効な場合、 ValueError が発生し、スタックサイズは変更されません。 32 KiBは現在、インタプリタ自体に十分なスタックスペースを保証するためにサポートされている最小スタックサイズ値です。 一部のプラットフォームでは、32 KiBを超える最小スタックサイズが必要な場合や、システムメモリページサイズの倍数での割り当てが必要な場合など、スタックサイズの値に特定の制限がある場合があることに注意してください。詳細については、プラットフォームのドキュメントを参照してください(4 KiBページ)。一般的です。より具体的な情報がない場合は、スタックサイズに4096の倍数を使用することをお勧めします)。
_thread.TIMEOUT_MAX

Lock.acquire()timeout パラメーターに許可される最大値。 この値より大きいタイムアウトを指定すると、 OverflowError が発生します。

バージョン3.2の新機能。

ロックオブジェクトには次のメソッドがあります。

lock.acquire(waitflag=1, timeout=- 1)

オプションの引数がない場合、このメソッドは無条件にロックを取得します。必要に応じて、別のスレッドによって解放されるまで待機します(一度に1つのスレッドのみがロックを取得できます。これが、ロックが存在する理由です)。

整数 waitflag 引数が存在する場合、アクションはその値に依存します。ゼロの場合、ロックは待機せずにすぐに取得できる場合にのみ取得され、ゼロ以外の場合、ロックは取得されます。上記のように無条件に。

浮動小数点 timeout 引数が存在し、正の場合、戻るまでの最大待機時間を秒単位で指定します。 負の timeout 引数は、無制限の待機を指定します。 waitflag がゼロの場合、 timeout を指定することはできません。

ロックが正常に取得された場合、戻り値はTrueであり、そうでない場合はFalseです。

バージョン3.2で変更: timeout パラメーターが新しくなりました。

バージョン3.2で変更:ロック取得をPOSIX上のシグナルによって中断できるようになりました。

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 例外は、ロックが取得された後に発生します。
  • メインスレッドが終了すると、他のスレッドが存続するかどうかがシステムで定義されます。 ほとんどのシステムでは、 tryfinally 句を実行したり、オブジェクトデストラクタを実行したりせずに強制終了されます。
  • メインスレッドが終了すると、通常のクリーンアップは実行されず( tryfinally 句が尊重されることを除いて)、標準I / Oファイルはフラッシュされません。