Pythonマルチスレッドとスレッドプールの原則

 

マルチスレッド:同時に複数のことを行う

デーモンスレッド:プログラムで子スレッドがデーモンスレッドとして設定されている場合、子スレッドはメインスレッドが終了すると自動的に終了します。設定方法はthread.setDaemon(True)で、thread.start()の前に設定する必要があります。 。デフォルトはFalseです。つまり、メインスレッドが終了しても、子スレッドは引き続き実行されます。

thread.join():子スレッドの実行が終了する前に、子スレッドの親スレッド(通常はメインスレッド)が常に存在します。つまり、ブロックされます。


スレッドプールの原則スレッドプールの基本原則:タスクをキューに入れてからNスレッドを開き、各スレッドがキューに移動してタスクを取得します。実行が終了したら、実行したことをシステムに通知します。 、次にキューに移動してそれを取得します。次のタスクは、キュー内のすべてのタスクが空になるまで、スレッドを終了します。

上記の例では、3つのスレッドでスレッドプールを生成し、各スレッドは無限にループして、キューキューを読み取るタスクをブロックします。すべてのタスクは、これらの3つの事前生成されたスレッドによってのみ処理されます。

具体的な作業は次のとおりです。

Queue.Queue()インスタンスを作成し、データまたはタスクで埋め
ますデーモンスレッドプールを生成し、スレッドをデーモンデーモンスレッドに設定します。
各スレッドは無限にループしてキューキューからのアイテムの読み取りをブロックし、
毎回処理します。ジョブの完了後、queue.task_done()関数を使用して、タスクが完了したキューにシグナルを送信します。
メインスレッドは、タスクキューが空になるまでブロックするようにqueue.join()を設定し、ブロックを解除して実行します。下向き
。このモードで注意すべき点がいくつかあります。

スレッドプールのスレッドをデーモンプロセスに設定すると、メインスレッドが終了すると、デーモンスレッドが自動的に終了します。デフォルトの
daemon = Falseが使用されている場合、非デーモンスレッドはメインスレッドの終了をブロックします。キュータスクも完了しました
スレッドプールは、タスクを待機している無限ループをブロックしているため、メインスレッドは終了しません。

メインスレッドがqueue.join()を使用する場合、キューが空になるまでメインスレッドがブロックされることを意味します。メインスレッドは、キューが空になったことをどのように認識しますか?つまり、各スレッドqueue.get()の後、タスクの処理後にqueue.task_done()シグナルを送信すると、キューデータが空になるまでキューデータが1つ減り、queue.join()がブロックを解除してダウンします。実施した。

このモードは主にキューのタスクに基づいており、タスクが完了すると終了します。スレッドプールはデーモンであるため、メイン出口スレッドプールのすべてのスレッドが終了します。キューにつながる可能性のある通常のthread.join()ブロッキングとは異なり、この種のスレッドは、完了する前にメインスレッドをブロックします。どのjoin()を使用する必要があるかを確認します。

特定の数のタスクでキューを終了する場合は、指定された数のWebページをクロールするなど、queue.join()を使用します。
スレッドでタスクを終了する場合は、thread.join()を使用します。

import time 
import queue 
import threading 

queue = queue.Queue()


#スレッドプールで実行する必要のあるタスクを定義します
def do_job():
    while True:
        i = queue.get()
        time.sleep(1)
        print(i、 threading.current_thread())
queue.task_done 
        ()

if __name__ == '__ main __':
    #3つのスレッドを含むスレッドプールを作成します
    time.sleep(3)
    for i in range(10):
        queue.put(i)

    for i in range(3):
        t = threading.Thread(target = do_job)
        t.daemon = True#スレッドデーモンのメインスレッド出口を設定します。デーモンスレッドも起動されます
        。t.start()を実行している場合でも

    #シミュレートします。スレッドプールを3秒間作成してから、10個のタスクをキュー
    queue.join()に挿入します。



 

おすすめ

転載: blog.csdn.net/weixin_45131345/article/details/106896676