pythonスレッド終了方法

1950 ワード

FIFOは一般的なキューであり、いくつかの一般的な方法は次のとおりです.
    Queue.qsize()戻りキューサイズ
    Queue.Empty()キューが空かどうかを判断
    Queue.full()キューがいっぱいかどうかを判断する
    Queue.get([block[,timeout]])はキューヘッダからitemを削除して返します.blockのデフォルトはTrueで、キューが空いているのにgetに行くとスレッドがブロックされ、itemが現れるまでgetがこのitemを出すまで待つことを示します.Falseであれば、キューが空いているのにgetに行くと異常が発生することを示します.blockがTrueの場合はtimeoutパラメータを再設定できます.キューが空の場合、getがtimeoutで指定した秒数をブロックした後もgetが着かないとFull異常を引き起こすことを示します.
    Queue.put(…[,block[,timeout]])はキューの最後にitemを挿入し,同様にblock=Trueであればキューがいっぱいになるとブロックして空きが出てからputを待ち,block=Falseで異常を引き起こす.同じgetのtimeout,putのtimeoutはblockがTrueのときにタイムアウト設定を行うパラメータである.
    Queue.task_done()シーンから言えば、getから出たitemを処理した後、task_を呼び出すdoneは、このタスクが完了したことを示す信号をキューに送信します.
    Queue.join()はすべてのitemを監視し、すべてのitemがtask_を呼び出すまでメインスレッドをブロックします.doneの後、メインスレッドは下向きに実行されます.この利点は、スレッドが最後のタスクを処理し始めると、タスクキューから最後のタスクを取り出し、タスクキューが空になりますが、最後のスレッドはまだ処理されていません.joinが呼び出されると、メインスレッドはキューが空いているために勝手に終了するのではなく、最後のスレッド処理が完了するのを待つ.
スレッド終了はフラグビットを設定ことができ、キューを使用してデータを取得するスレッドはqueueを設定することができる.getはブロックタイムアウトを設定します.
キューからデータを取得するスレッドの簡単な終了例:
import queue
import sys 
import threading

def worker(name, q, exit_flag):
    while not exit_flag.is_set():
        try:
            #     ,      exit_flag
            item = q.get(timeout=3)
        except queue.Empty:
            continue
        print('thread {}, item {}'.format(name, item), file=sys.stderr)
        q.task_done()

def main():
    #        
    exit_flag = threading.Event()
    exit_flag.clear()

    #           
    q = queue.Queue()
    num_of_threads = 5 
    threads = [threading.Thread(target=worker, args=(str(i+1), q, exit_flag))
               for i in range(num_of_threads)]
    for t in threads:
        t.start()
    for i in range(50):
        q.put(i)
    q.join()

    #       ,      , join  
    exit_flag.set()
    for t in threads:
        t.join()
        
if __name__ == '__main__':
    main()