cre8cre8
AskMe♥

たった30行でPython3のマルチスレッドを使ってみる

「最近マルチスレッドプログラミングしてないなぁ…」
っと思い立ったが吉日。どうも、たくみです。
マルチスレッドプログラミングしなさすぎて、スレッド処理のことが記憶からロストしそうになったので、この記事を書いてみました。
ついでに、Python3でマルチスレッドしたことなかったので私にとってもいい勉強になりました^^

それでは早速コードを見てみましょう。

mythread.py
1from threading import Thread
2# sleepメソッドを使用して一時的に処理を止めることにより、
3# スレッドの動作が理解しやすくなるので、timeをimportする
4import time
5
6class MyThread(Thread):
7
8    def run(self):
9        thread_name = self.getName()
10
11        print('{0} 開始'.format(thread_name))
12
13        for i in range(5):
14            time.sleep(1)  # sleepしないとループが一瞬で終わるので少し止める
15            print('{0} お仕事ちゅう ({1}/5)'.format(thread_name, (i+1)))
16
17        print('{0} 終了'.format(thread_name))
18
19if __name__ == '__main__':
20
21    # のんのんびよりっていいよね。というわけで、のんのんびよりよりお名前少し拝借しました。
22    mythread_names = ['こまちゃん', 'れんちょん', 'ひかねえ']
23
24    for name in mythread_names:
25        MyThread(name=name).start()
26        time.sleep(0.5)  # スレッドが非同期で動いているのを確かめるためsleepで少し止める
27
28    print('メインスレッドを10秒停止します')
29    time.sleep(10)  # サブスレッド実行中にmainスレッドが落ちないように10秒停止する
30    print('メインスレッドを終了します。')

なんということでしょう。本当に30行でマルチスレッド処理ができましたね。
その気になってコメントや無駄な空行をなくしたらもっと短くできますね。

今回はthreadingモジュール内で定義されているThreadクラスを継承してマルチスレッド処理を実現したので、
threadingモジュールをimportします。
Threadクラスのrunメソッドをオーバーライドして、スレッドで実行する処理を記述していきます。
Threadクラスを継承したクラスでは、self.getName()メソッドで設定したスレッド名を取得できます。

スレッドを呼び出すには、25行目に記載しているMyThread(name=name).start()のようにstartメソッドを呼び出します。
スレッドに名前をつけたい場合は、サンプルコードのように、引数nameにつけたい名前を指定してください。
この引数を省略した場合は、Thread-1,Thread-2...のような名前が自動でつけられます。

29行目でメインスレッドを10秒間停止していますが、sleepせずにメインスレッドが終了してもPython3ではサブスレッドが実行されます。
たくみはサブスレッドだけ生き続けて実行されると、あとで制御したいときにめんどくさいので、メインスレッドは最後まで生かしておく派です。
(というか、メインスレッド死んでもサブスレッドが生き続けて実行されるというのをこの記事執筆中に知りました。)

≪ 前の記事
Railsでファイルをアップロードしてpublicディレクトリに保存したあとに表示する
次の記事 ≫
Python3で一時ディレクトリ(tmp/temp)を使う方法

いいねやコメントを送っていただけると中の人がしっぽ振って大喜びします♪

あなたへのおすすめの記事