Python
queue
Threading

非同期スレッドでキューを処理する

pythonの非同期処理には、threadingmultiprocessingasyncioの3種類があります。それぞれの違いについてはこちらの記事が詳しいです。

今回はマルチスレッド処理のthreadingを使って複数スレッドをたて、単一のキューからデータを取り出して処理していく方法を紹介します。

いきなりですが、そのコードがこちら。


async.py

from queue import Queue

from threading import Thread
import time

def worker(q):
while True:
result = q.get()
time.sleep(1)
print(result)
q.task_done()

if __name__ == '__main__':
q = Queue()

for _ in range(3):
thread = Thread(target=worker, args=(q,))
thread.setDaemon(True)
thread.start()

a = [1, 2, 3, 4, 5, 6]
for i in a:
q.put(i)

q.join()



スレッドで実行する処理

worker()はスレッドで実行させる処理です。

q.get()でキューから要素を取り出し、1秒スリープしてから取り出した要素を表示しています。q.task_done()でキューから取り出した要素の処理が完了したことをキューに知らせます。これらの処理を無限ループします。


メイン処理

メインの処理では、q = Queue()でキューを作成します。引数にmaxsizeを指定しない場合はキューの大きさは無限になります。

thread = Thread(target=worker, args=(q,))でスレッドを作成し、上で作成したworker()関数と引数を渡します。

thread.setDaemon(True)でスレッドをデーモンスレッドにする処理です。デーモンスレッドは残っているスレッドがデーモンスレッドだけの時pythonプログラムを終了させます。

thread.start()でスレッドをスタートさせています。

今回はfor文で3つのスレッドをたてています。

次はキューにaの要素を順次入れていきます。

最後q.join()でキューの処理が全部終わるまで待機します。


実行結果

このプログラムを実行すると、

python async.py

# 1秒待機
1
3
2
# 1秒待機
5
6
4

のようになります。

3つのスレッドが同時に実行されるので、順番は実行するたび変わって3つずつ出力されるのが確認できるかと思います。


参考