pythonでスレッドを生成してコールバック呼び出す

pythonでスレッドを生成してコールバック呼び出す

pythonを最近触リ始めたので、スレッドの立て方、コールバック、クラスの勉強のためにコード書いてみた。
もし、気づいた点ありましたらTwitterなどもやっているのでぜひ指摘お願いします。

実行環境

$ python -V
Python 2.7.10

書いたコード

# coding:utf-8
import time
from threading import Thread

class ThreadManager():
    def __init__(self, callback, time_count):
        self.tmthread = TimeManageThread(callback, time_count)
        self.tmthread.start()
    def cancelTimer(self):
        self.tmthread.cancelTimer()

class TimeManageThread(Thread):
    def __init__(self, callback, time_count):
        Thread.__init__(self)
        self.__callback = callback
        self.__iscancel = False
        self.__time_count = time_count

    def run(self):
        for i in range(self.__time_count):
            time.sleep(1)
            if self.__iscancel == True:
                self.__callback("Timer canceled!")
                return
        self.__callback(str(self.__time_count) + " sec counted!")

    def cancelTimer(self):
        self.__iscancel = True

def timerCallback(message):
    print(message)

def test1():
    print("test1 start")
    # 5sec timer start
    t1 = ThreadManager(timerCallback, 5)
    print("test1 end")

def test2():
    print("test2 start")
    # 8sec timer start
    t2 = ThreadManager(timerCallback, 8)
    time.sleep(3)
    t2.cancelTimer()
    print("test2 end")


if __name__ == "__main__":
    test1()
    test2()
    print("end")

動作解説

サンプルコードは、Threadクラスを継承したTimeManageThreadクラスと、それを管理するThreadManagerからなる。
test1()を見てもらうとわかるが、TimeManageThreadはユーザが直接アクセスすることはない。
ThreadManagerのインスタンス生成時に、カウントしたい秒数と、カウント完了した時に呼ばれるコールバック関数を登録する。
test1の場合は5秒後にtimerCallback(message)が呼ばれる。
さらにタイマーカウント中でもキャンセルできるようにcancelTimer()メソッドを持たせた。
test2ではタイマーを8秒にセットしたが、3秒後にキャンセルしている。キャンセルされた際もコールバック関数が呼ばれるようにした。

実行結果

$ python test.py
test1 start
test1 end
test2 start
test2 end
end
Timer canceled!
5 sec counted!


タイマー開始して、test2()のタイマーが3秒後にキャンセル。
test1()のタイマーが5秒後にカウント完了が呼ばれていることが確認でき、意図した通りに動作している。

よかったら「いいね」お願いします!
Text by Takashi Yoshida