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