「Pythonのマルチスレッドプログラミング」の版間の差分

提供: Python入門
移動: 案内検索
(ページの作成:「Pythonでマルチスレッドプログラミングを行う場合には、'''threading'''(スレッディング)モジュールを利用します。 '''読み方''' ;th...」)
 
(相違点なし)

2016年1月20日 (水) 18:38時点における最新版

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) にすることで、見えんスレッドが終了すると、サブスレッドも終了します。

関連項目