Python - キュー [queue] task_done() と join() の基本的な使用法

I.はじめに

task_done()このメソッドはPythonモジュールによって提供されqueue、キュー内の項目が処理されたことをキュー マネージャーに通知するために使用されます。

queue.task_done()これは、キュー内の項目が処理されたことをオブジェクトにQueue通知するために使用されるオブジェクトのメソッドです。Queue通常、Queue オブジェクトを使用する場合、プロデューサーがデータをキューに入れた後、コンシューマーはキューからデータを取り出して処理する必要があります。コンシューマはデータ項目を処理した後、queue.task_done()メソッドを使用してキューに通知できるため、Queueオブジェクトはキュー内のどの項目が処理されたかを知ることができます。

キューを使用するときは、通常、put()メソッドを使用して項目をキューに追加し、その後 get() メソッドを使用してキューから項目を取得して処理します。項目を処理した後、task_done()メソッドを使用して、項目が処理されたことをキューマネージャーに通知できます。

すべての項目が処理されるのを待つメソッドを使用する場合join()、このメソッドはすべての項目が処理された後に戻ります。

2. 基本的な使い方

サンプルコード

import queue
import threading

def worker(q):
    while True:
        item = q.get()
        print("Processing", item)
        q.task_done()

if __name__ == '__main__':
    q = queue.Queue()
    for i in range(5):
        q.put(i)

    for i in range(3):
        t = threading.Thread(target=worker, args=(q,))
        t.daemon = True
        t.start()

    q.join()
    print("All items processed.")

上記のサンプル コードでは、まずキュー q を作成し、そこに 5 つのアイテムを追加します。worker()次に、キューから項目を取得する関数とtask_done()それを破棄するメソッドを使用する 3 つのスレッドを作成しました。join()全項目の処理が完了するまで待つ方法を採用したため、全項目の処理が完了すると、最終的に「全項目処理されました。」が出力されます。

操作結果:
ここに画像の説明を挿入します

この例では、task_done()項目がキューから削除されるたびにこのメソッドが 1 回呼び出されるため、キュー マネージャーは最終的にすべての項目が処理されたことを認識します。

3. リアルタイムタスク完了通知の利用

読みながら読むサンプルコード:

ここではプロデューサとコンシューマが定義され、Queueデータ送信にはオブジェクトが使用されます。プロデューサは 10 個のデータ項目をキューに入れ、各データ項目の間に 1 秒間一時停止します。一方、コンシューマはキューからデータ項目を削除して処理し、各データ項目が取り出された後 2 秒間一時停止します。コンシューマーが各データ項目を処理した後、q.task_done()メソッドを使用してキューに通知し、データ項目が処理されたことをキューが認識できるようにします。

import queue
import threading
import time


def producer(q):
    for i in range(10):
        q.put(i)
        print("[Producer] Put item {} into queue".format(i))
        time.sleep(1)


def consumer(q):
    while True:
        item = q.get()
        print("[Consumer] Get item {} from queue".format(item))
        q.task_done()
        print(f'task {
      
      threading.current_thread().name} done! item-->:{
      
      item}')
        time.sleep(2)


if __name__ == '__main__':
    q = queue.Queue()
    t1 = threading.Thread(target=producer, args=(q,))
    t2 = threading.Thread(target=consumer, args=(q,))
    t1.start()
    t2.start()
    t1.join()
    t2.join()

実行結果:
ここに画像の説明を挿入します
ここのコードはスレッドを使用してプロデューサーとコンシューマーをシミュレートし、プロデューサーとコンシューマーの両方が同時にデータの書き込みと取得を行うため、データの生成と消費が交互に実行されることがわかります。

特定の用途では、よりさまざまなビジネス シナリオで使用方法を選択する必要があります

以上、Python の基本的な使い方 - Queue [queue] task_done() と join() の紹介でした。読んでいただきありがとうございます。お役に立てれば幸いです。

おすすめ

転載: blog.csdn.net/qq_43030934/article/details/132755839