マルチスレッド | Python-izm

マルチスレッド

Pythonで複数のスレッドを用いた並列処理を行う方法です。

複数のスレッドによる処理

下記例ではメインスレッドの他にサブスレッドを生成し、それぞれのスレッドで現在時刻を表示しています。メインスレッドでは10秒おきに5回、サブスレッドでは5秒おきに5回の表示です。

import threading
import time
import datetime

class TestThread(threading.Thread):

    def run(self):
        print('  === start sub thread ===')
        for i in range(5):
            time.sleep(5)
            print('  sub thread : ' + str(datetime.datetime.today()))
        print('  === end sub thread ===')


th = TestThread()
th.start()

time.sleep(1)

print('=== start main thread ===')
for i in range(5):
    time.sleep(10)
    print('main thread : ' + str(datetime.datetime.today()))
print('=== end main thread ===')
  === start sub thread ===
=== start main thread ===
  sub thread : 2017-09-24 15:32:07.317000
  sub thread : 2017-09-24 15:32:12.345000
main thread : 2017-09-24 15:32:13.317000
  sub thread : 2017-09-24 15:32:17.346000
  sub thread : 2017-09-24 15:32:22.347000
main thread : 2017-09-24 15:32:23.318000
  sub thread : 2017-09-24 15:32:27.348000
  === end sub thread ===
main thread : 2017-09-24 15:32:33.319000
main thread : 2017-09-24 15:32:43.320000
main thread : 2017-09-24 15:32:53.321000
=== end main thread ===

新しく生成したサブスレッドが出力する時間のみ、半角スペース2つ分インデントして表示しています。
※22行目で1秒待機している理由は、メインスレッドの処理を遅らせてスタートさせ、出力結果が入り混じらないようにするためです。

デーモンスレッド

daemonプロパティによってサブスレッドをデーモンスレッドとするかを設定することができます。

import threading
import time
import datetime

class TestThread(threading.Thread):

    def run(self):
        print('  === start sub thread ===')
        for i in range(5):
            time.sleep(5)
            print('  sub thread : ' + str(datetime.datetime.today()))
        print('  === end sub thread ===')


th = TestThread()
th.daemon = True
# th.daemon = False
th.start()

time.sleep(1)

print('=== start main thread ===')
for i in range(5):
    time.sleep(10)
    print('main thread : ' + str(datetime.datetime.today()))
print('=== end main thread ===')

daemonプロパティはメインスレッドが終了した時のサブスレッドの挙動を制御します。処理が流れている最中に起動したプロセスを強制終了するとわかりますが、daemonにTrueを設定した場合、サブスレッドも一緒に終了します。Falseを設定した場合は、メインスレッドは終了してもサブスレッドの処理のみ継続して実行される形になります。
※設定しなかった場合のデフォルト値はメインスレッドから継承されます(メインスレッドのdaemonプロパティはFalse)。