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つずつ出力されるのが確認できるかと思います。