pythonの非同期処理には、threading、multiprocessing、asyncioの3種類があります。それぞれの違いについてはこちらの記事が詳しいです。
今回はマルチスレッド処理のthreadingを使って複数スレッドをたて、単一のキューからデータを取り出して処理していく方法を紹介します。
いきなりですが、そのコードがこちら。
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つずつ出力されるのが確認できるかと思います。