Pythonのマルチスレッドプログラミング
Pythonでマルチスレッドプログラミングを行う場合には、threading(スレッディング)モジュールを利用します。
読み方
- threading
- すれっでぃんぐ
目次
概要
並列プログラミングは、
- マルチプロセス
- マルチスレッド
で実現できます。
マルチプロセスとマルチスレッドは、それぞれ、メリットとデメリットがあります。 ここでは、プログラムの簡単な間内スレッド化について解説します。
まずはじめに
ここで、超簡単なスレッドプログラムの例を示します。
#! /usr/bin/env python # -*- coding: utf-8 -*- # vim:fenc=utf-8 # # Copyright © 2016 kaoru <kaoru@localhost> import threading def hello(arg): print arg threading.Thread(target=hello, args=("world",)).start()
これは、world と表示するだけのプログラムです。
$ python hello_thread.py world
Pythonのプログラムをマルチスレッド化する方法
Pythonのプログラムをマルチスレッド化するには、以下の方法があります。
- threading.Thread のサブクラスを作成します。
- threading.Thread のインスタンスを作成します。
サブクラスを利用したスレッド thread_subclass
ソースコード thread_subclass.py
TestThread は、 threading.Thread のサブクラスです。スリープをしながら、カウンタを表示するだけのプログラムです。
#! /usr/bin/env python # -*- coding: utf-8 -*- # vim:fenc=utf-8 # # Copyright © 2016 kaoru <kaoru@localhost> # import threading import time class TestThread(threading.Thread): def __init__(self): threading.Thread.__init__(self) def run(self): for i in range(5): time.sleep(1) print "sub thread : " + str(i) if __name__ == '__main__': t1 = TestThread() t1.start() t1.join() print "end"
実行例
thread_subclass.py の実行例です。
$ python thread_subclass.py sub thread : 0 sub thread : 1 sub thread : 2 sub thread : 3 sub thread : 4 end
このサンプルコードでは、スレッドを join しています。 join をしない場合、先にメインスレッドが終了してしまいます。そのため、end が先に表示されることになります。
インスタンスを利用したスレッド
ソースコード thread_instance.py
#! /usr/bin/env python # -*- coding: utf-8 -*- # vim:fenc=utf-8 # # Copyright © 2016 kaoru <kaoru@localhost> # import threading def foo(n): for i in range(n): print "sub thread : " + str(i) if __name__ == '__main__': t1 = threading.Thread(target=foo, name="foo", args=(5,)) t1.start() t1.join() print "end"
実行例
sub thread : 0 sub thread : 1 sub thread : 2 sub thread : 3 sub thread : 4 end
メインスレッドが終わったときにスレッドも終了する方法 setDaemon
メインスレッドが終了した場合に、サブスレッドの制御を setDaemon() で設定できます。 デフォルトでは、メインスレッドが終了した場合に、サブスレッドが終了するまで、待ちます。 setDaemon()でTrue を設定した場合、メインスレッドが終了した瞬間にプログラム全体が終了(サブスレッドも終了)します。
以下の様にプログラムを書いた場合、 メインスレッドが終了したときに、TestThread()も一緒に終了してしまいます。
f __name__ == '__main__': t1 = TestThread() t1.setDaemon(True) t1.start() print "end"
まとめ
Pythonでスレッドを作成する場合には、threading モジュールを利用します。以下のいずれかの方法でプログラムをマルチスレッド化できます。
- threading.Thread のサブクラスを作成します
- threading.Thread のインスタンスを作成します。
メインスレッド終了時のサブスレッドの制御は、 setDaemon() 関数で制御できます。setDaemon(True) にすることで、見えんスレッドが終了すると、サブスレッドも終了します。
関連項目
ツイート