Python 3.7.1モジュールは同時に下位スレッドAPIを実行する_thread


最下位スレッドAPI
  • 1._thread関数
  • exception _thread.error
  • _thread.LockType
  • _thread.start_new_thread(function, args[, kwargs])
  • _thread.interrupt_main()
  • _thread.exit()
  • _thread.allocate_lock()
  • _thread.get_ident()
  • _thread.stack_size([size])
  • _thread.TIMEOUT_MAX
  • 2.lock関数
  • lock.acquire(waitflag=1, timeout=-1)
  • lock.release()
  • lock.locked()
  • 3.その他
  • 4.例
  • このモジュールは、軽量レベルのプロセスまたはタスクとも呼ばれるマルチスレッドを処理するための低レベルの原語である複数の制御スレッドがグローバルデータ空間を共有することを提供する.同期のために、単純なロック(反発ロックまたはバイナリ信号量とも呼ばれる)が提供される.threadingモジュールは、このモジュールに基づいて構築されたより使いやすく、より高いレベルのスレッドAPIを提供する.
    バージョン3.7で変更されました:このモジュールはオプションであり、現在は常に使用可能です.
    1._thread関数
    このモジュールは、次の定数と関数を定義します.
    exception _thread.error
    スレッド固有のエラーが発生しました.
    バージョン3.3で変更:RuntimeErrorを内蔵する同義語です.
    _thread.LockType
    これは、オブジェクトをロックするロックのタイプです.
    _thread.start_new_thread(function, args[, kwargs])
    新しいスレッドを起動し、識別子を返します.スレッドは、パラメータリストargs(メタグループでなければならない)を使用してfunction関数を実行します.オプションのkwargsパラメータは、キーワードパラメータの辞書を指定します.関数が返されると、スレッドはサイレントで終了します.関数が未処理の例外で終了すると、印刷スタックが追跡され、スレッドが終了します(他のスレッドは実行を続行します).
    _thread.interrupt_main()
    プライマリスレッドでKeyboardInterrupt異常が発生します.サブスレッドは、この関数を使用してメインスレッドを中断できます.
    _thread.exit()
    SystemExit異常が発生しました.キャプチャされていない場合、スレッドはサイレントで終了します.
    _thread.allocate_lock()
    新しいロックオブジェクトを返します.ロックの方法は以下の通りです.ロックは最初は非ロックです.
    _thread.get_ident()
    現在のスレッドのスレッド識別子を返します.これはゼロ以外の整数です.その値には直接的な意味はありません.インデックススレッドなどの特定のデータの辞書として使用されるmagicクッキーを目的としています.スレッドが終了して別のスレッドが作成されると、スレッド識別子を回収できます.
    _thread.stack_size([size])
    新しいスレッドを作成するときに使用するスレッドスタックサイズを返します.オプションのsizeパラメータは、後で作成するスレッドのスタックサイズを指定し、0(プラットフォームまたは構成済みのデフォルト値を使用)または少なくとも32768(32 KiB)の正の整数値でなければなりません.sizeが指定されていない場合は0を使用します.スレッドスタックサイズの変更がサポートされていない場合は、RuntimeErrorが開始されます.指定したスタックサイズが無効な場合、ValueErrorが発生し、スタックサイズは変更されません.32 KiBは現在サポートされている最小スタックサイズ値であり、解釈器自体に十分なスタックスペースがあることを保証します.一部のプラットフォームでは、スタックサイズの値に特定の制限がある場合があります.たとえば、最小スタックサイズ>32 KiBまたはシステムメモリページサイズの倍数で割り当てる必要がある場合は、プラットフォームドキュメントを参照して詳細を参照してください(4 KiBページは一般的です.詳細な情報がない場合は、4096の倍数をスタックサイズとして使用することをお勧めします).
    可用性:Windows、POSIXスレッドを持つシステム.
    _thread.TIMEOUT_MAX
    許可ロックacquire()のtimeoutパラメータの最大値.この値を超えるタイムアウトを指定すると、OverflowErrorが発生します.
    バージョン3.2の新機能.
    2.lock関数
    オブジェクトをロックするには、次の方法があります.
    lock.acquire(waitflag=1, timeout=-1)
    オプションのパラメータがない場合、この方法は無条件にロックを取得し、必要に応じて別のスレッドによって解放されるのを待つ(ロックを取得できるのは一度に1つのスレッドだけである-これが原因である).
    整数waitflagパラメータが存在する場合、アクションはその値に依存します.ゼロの場合、ロックは待機せずにすぐに取得され、ゼロでない場合、上記のように無条件に取得されます.
    浮動小数点型timeoutパラメータが存在し、正の場合、戻るまでの最長待ち時間(秒単位)を指定します.負のtimeoutパラメータは、無制限待機を指定します.waitflagがゼロの場合、タイムアウトを指定できません.
    ロックが正常に取得されると値Trueが返され、そうでない場合は値Falseが返されます.
    バージョン3.2で変更:このタイムアウトパラメータは新しく追加されました.
    バージョン3.2で変更:POSIXの信号割り込みロックで取得できます.
    lock.release()
    ロックを解除します.ロックは先に取得する必要がありますが、必ずしも同じスレッドではありません.
    lock.locked()
    ≪ロックのステータスを返します|Return Lock Status|oem_src≫:あるスレッドによって取得された場合、Falseが返されない場合、戻りTrueが取得されます.
    3.その他
    これらの方法に加えて、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異常は、ロックがaccquiredされた後に発生します.
  • メインスレッドが終了すると、システムは他のスレッドが生存するかどうかを決定します.ほとんどのシステムでは、try...finally句またはオブジェクト構造関数を実行せずに終了します.
  • プライマリ・スレッドが終了すると、try...finally句が使用される以外は、通常のクリーンアップは実行されず、標準I/Oファイルはリフレッシュされません.

  • 4.インスタンス
    ここではネットユーザーの実例を引用して説明する
    #!/usr/bin/env python3
    # coding:utf-8
    from time import ctime
    from time import sleep
    import _thread
    
    loops = [4, 2, 3, 5]
    
    
    def loop(nloop, nsec, lock):    #      :  ,    ,   
        print("start loop", nloop, 'at:', ctime())
        sleep(nsec)
        print("loop", nloop, "done at:", ctime())
        lock.release()  #    
    
    
    def main():
        print('start at:', ctime())
        locks = []
        nloops = range(len(loops))
    
        for i in nloops:
            lock = _thread.allocate_lock()  #      
            lock.acquire()  #      
            locks.append(lock)
    
        for i in nloops:
            _thread.start_new(loop, (i, loops[i], locks[i]))
    
        #         
        for i in nloops:
            while(locks[i].locked()):
                pass
        print('all DONE at', ctime())
    
    
    if __name__ == '__main__':
        main()