デーモンスレッドと通常スレッドは違う

  • スレッド破棄のタイミング
    • スレッドが正常終了時
    • スレッド内でエクセプションがあり異常終了時
    • デーモンスレッドはデーモンスレッド以外のスレッドがなくなった時点で全て自動終了する
  • Thread中の動きを決定するには
    • Threadオブジェクトを__init__(),run()のみオーバーライドする
      • それ以外はオーバーライド禁止
    • 呼び出し可能オブジェクトをコンストラクタに渡すのどちらか
import threading
import time

class test(threading.Thread):
    def __init__(self,deamon=True):
        super(test,self).__init__()
        # setDaemonをする事でスレッドをデーモン化できるらしい
        self.setDaemon(deamon)
        self.i = 0

    def run(self):
        print "st:"
        while True:
            time.sleep(1)
            self.i += 1
      # Daemonスレッドでなければ5秒で強制終了
	    if self.i == 5 and not self.isDaemon():
                print('-' * 20)
		print('Non DaemonThread %s Aborted' % self.getName())
                print(self.getName() + ':end')
                print('-' * 20)
		raise Exception

            print("%s is a Daemon? [%s] ,count:[%s]" %  (self.getName(),self.isDaemon(),str(self.i * 1)))
        # Daemonスレッドの終了処理は出力されない
        # __del__メソッドにコメント入れても出力されないのは何でだ?
        print('-' * 20)
        print(self.getName() + ':end')
        print('-' * 20)

if __name__ == "__main__":
    # Daemonスレッド
    t = test()
    t.start()
    # Daemonじゃないスレッド
    t = test(False)
    t.start()
    time.sleep(3) # 3秒後main処理終了
    
    print('-' * 20)
    print('main thread'+ ':end')
    print('-' * 20)