Pythonのqueue
モジュールは、スレッド間でデータをやり取りするためのFIFO(First In, First Out)データ構造を提供します。queue.Queue()
を使用してキューを作成し、put()
メソッドでデータを追加し、get()
メソッドでデータを取り出すことができます。
しかし、マルチスレッド環境では、一つのスレッドがキューからデータを取り出すときに、そのキューが空でないことを確認する必要があります。そうでなければ、スレッドはブロックされ、プログラムは停止します。
import queue
import threading
q = queue.Queue()
def _worker():
while True:
msg = q.get(block=True)
if msg is None:
return
print(msg)
t = threading.Thread(target=_worker)
t.start()
q.put('task-1')
q.put('task-2')
q.put('task-3')
q.put('task-4')
上記のコードでは、_worker
関数がバックグラウンドスレッドで実行され、キューからメッセージを取り出して表示します。メインスレッドは、キューにタスクを追加します。
キューが空になるまでメインスレッドを待機させるには、queue.empty()
メソッドを使用します。このメソッドは、キューが空の場合にTrue
を返し、そうでない場合はFalse
を返します。
while not q.empty():
sleep(1)
このコードは、キューが空になるまでメインスレッドを1秒ごとにスリープさせます。
以上がPythonのqueue
モジュールを使用して、スレッド間でデータをやり取りする基本的な方法です。これを応用して、より複雑なマルチスレッドプログラムを作成することができます。