Python スレッド キュー

Muhammad Maisam Abbas 2023年10月10日
  1. Python のスレッド
  2. Python でキューを使用してスレッドを制限する
Python スレッド キュー

このチュートリアルでは、Python でアクティブなスレッドの数を制限する方法について説明します。

Python のスレッド

Python のスレッド化により、1つのプロセス内で複数の実行スレッドを同時に実行できます。 各スレッドは他のスレッドとは独立して実行されるため、同時実行が可能になり、パフォーマンスが向上します。

スレッド化は、1つのスレッドがブロックされている間に他のスレッドが実行を継続できるため、I/O バウンドまたは実行時間が長いタスクを実行する場合に特に役立ちます。

Python には、スレッドを作成および管理するための組み込みの threading モジュールが用意されています。 モジュール内の Thread クラスを使用して新しい実行スレッドを作成でき、start() メソッドを使用してスレッドの実行を開始できます。

join() メソッドを使用して、スレッドが実行を終了するのを待つことができます。

threading モジュールに加えて、Python は concurrent.futures モジュールも提供します。このモジュールは、callable を非同期に実行するための高レベルのインターフェイスを提供します。 このモジュールは ThreadPoolExecutor クラスを提供します。このクラスは、callable を並行して実行するために使用できるワーカー スレッドのプールを作成するために使用できます。

スレッド化は、Python プログラムのパフォーマンスを向上させるための強力なツールになる可能性がありますが、複雑になり、競合状態やその他の同期の問題が発生する可能性があるため、注意して使用する必要があります。

Python でキューを使用してスレッドを制限する

Python の Queue クラスは、複数のスレッドで処理する必要がある項目を格納するための、スレッドセーフで FIFO (先入れ先出し) データ構造を提供します。 スレッド間のデータの流れを調整し、同時に実行できるスレッドの数を制限するために使用できます。

キューを使用して同時に実行できるスレッドの数を制限したい場合は、Queue クラス内で maxsize パラメータを使用できます。 キューを使用してスレッドの総数を制限する方法の例を次に示します。

import threading
import queue
from queue import Queue
from threading import Thread


def function_to_be_executed():
    print(f"Thread {threading.get_ident()} is working")
    return


q = Queue(maxsize=3)

for i in range(10):
    try:
        thread = Thread(target=function_to_be_executed)
        q.put(thread, block=False)
    except queue.Full:
        q.get().join(timeout=0)
        thread = Thread(target=function_to_be_executed)
        q.put(thread, block=False)
    thread = q.get()
    thread.start()
while not q.empty():
    thread = q.get()
    thread.join(timeout=1)

出力:

Thread 140368505984768 is working
Thread 140368497592064 is working
Thread 140368505984768 is working
Thread 140368497592064 is working
Thread 140368505984768 is working
Thread 140368497592064 is working
Thread 140368514377472 is working
Thread 140368497592064 is working
Thread 140368497592064 is working
Thread 140368497592064 is working

上記のコードは、最大サイズが 3 の Queue オブジェクトを作成します。これは、任意の時点で 3つのスレッドしかキューに入れられないことを意味します。 次に、10 個のスレッドが作成され、put() メソッドを使用してキューに追加されます。

while ループはキュー内のスレッドを 1つずつ開始し、join() メソッドを使用してすべてのスレッドが終了するのを待ちます。

この例では、同時に実行されているスレッドは 3つだけです。 残りは、実行する機会が得られるまでキューで待機します。 独自のニーズに合わせて、キューの最大サイズとスレッド数を調整できます。

Muhammad Maisam Abbas avatar Muhammad Maisam Abbas avatar

Maisam is a highly skilled and motivated Data Scientist. He has over 4 years of experience with Python programming language. He loves solving complex problems and sharing his results on the internet.

LinkedIn

関連記事 - Python Thread