search
LoginSignup
21

More than 1 year has passed since last update.

posted at

updated at

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

参考

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
21