近期需要用到线程去执行一个单独的循环任务,必要的时候可以关闭这个任务。在线程中运行关闭没有找到理想的方法,于是自己通过继承线程实现了,感觉比较方便。
先说下正常的使用,方便进行对比。
import threading
def task():
while True:
print "hello"
sleep(1)
t = threading.thread(target = func)
t.start()
t.join()
这里会发现任务一直被挂起无法退出任务和结束线程,那么通过状态控制while的执行是基本的方法
我使用最直接分方法把状态控制与线程捆绑在一起,只要执行join函数就可以退出任务关闭线程,让使用者没有感觉差异性。
class LoopThread(threading.Thread):
def __init__(self, group=None, target=None, name=None,
args=(), kwargs=None, verbose=None):
super(LoopThread,self).__init__()
self.excute = False
self.__target = target
self.__args = args
if kwargs is None:
kwargs = {}
self.__kwargs = kwargs
def run(self):
try:
if self.__target:
while self.excute:
self.__target(*self.__args, **self.__kwargs)
finally:
# Avoid a refcycle if the thread is running a function with
# an argument that has a member that points to the thread.
del self.__target, self.__args, self.__kwargs
def loopstart(self,state = True):
self.excute = state
self.start()
def loopjoin(self,timeout=None):
self.excute = False
self.join(timeout)
这里主要的重载了run方法,提供了新的start和join,使用方法与正常的线程一致
import threading
def task():
while True:
print "hello"
sleep(1)
t = LoopThread(target = task)
t.loopstart(True)#参量控制是否循环执行
sleep(10)
t.loopjoin()
这里就循环执行10秒后任务与线程正常退出