Pythonでマルチスレッド処理をさせたいと思ったので、具体的な方法を調べて試してみました。
マルチスレッドで処理させるには、どうやら大きく2つの方法があるらしいです。せっかくなので、勉強のために今回は両方で試してみます。ちなみにPython3での実装です。
方法1:Threadクラスを継承する
まず1つ目の方法は、threading.Threadクラスを継承したクラスを作るという方法です。具体的なコードで書くとこんな感じ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
import time import threading class myThread(threading.Thread): def __init__(self): super(myThread, self).__init__() def run(self): for i in range(0,5): time.sleep(1) print("count", i) if __name__ == '__main__': th1 = myThread(); th2 = myThread(); th1.start() th2.start() |
スレッド内で実行したい処理をrun関数内に実装してあげることがポイントです。今回は5秒間、1秒間隔でカウントアップする処理を実装しました。
メイン処理では、作成したクラスのインスタンスを2つ作り、それぞれstart関数で実行開始します。実行結果はこんな感じ。
count 0
count 0
count 1
count 1
count 2
count 2
count 3
count 3
count 4
count 4
たしかにスレッド2つの処理が並行して走っていることが分かります。
方法2:Threadクラスのインスタンスを作る
2つめの方法は、Threadクラスのインスタンスを作る方法です。並列処理したい関数を引数に設定してthreading.Threadクラスのインスタンスを作ると、start関数で処理を走らせることができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
import time import threading def proc(): for i in range(0,5): time.sleep(1) print("count", i) if __name__ == '__main__': th1 = threading.Thread(target=proc) th2 = threading.Thread(target=proc) th1.start() th2.start() |
こちらの実装でも実行結果は先ほどと変わりません。クラスを定義しなくてもいい分、こちらの方がお手軽かもしれません。
まとめ
どちらの方法でも割と簡単に並列処理を実装することができました。サブクラスを作るのかそれともインスタンスを作るのかはケースによって使い分けが必要そうですが、並列化したい処理の規模が小さければインスタンスの方がずっと簡単そうです。
今回はほんの触りだけだったので、もう少し深いところまで調べてみようと思います(・∀・)
ではではノシ