python中如何中止一个线程

转载自:http://www.708luo.com/?p=30

 

class KillableThread(threading.Thread):
"""A subclass of threading.Thread, with a kill() method."""
def __init__(self, *args, **keywords):
threading.Thread.__init__(self, *args, **keywords)
self.killed = False

def start(self):
"""Start the thread."""
self.__run_backup = self.run
self.run = self.__run # Force the Thread to install our trace.
threading.Thread.start(self)

def __run(self):
""" Hacked run function, which installs the trace."""
sys.settrace(self.globaltrace)
self.__run_backup()
self.run = self.__run_backup

def globaltrace(self, frame, why, arg):
if why == 'call':
return self.localtrace
else:
return None

def localtrace(self, frame, why, arg):
if self.killed:
if why == 'line':
raise SystemExit()
return self.localtrace

def kill(self):
self.killed = True

不过这个实现也有一个弊端:如果需要kill的线程正在sleep或者正阻塞在更底层的操作上,是没有办法立即kill掉的。

简单来说,它kill的原理是设置一个flag位,然后线程在执行下一句python语句检测到这个位被设置了之后,就会自行退出,以达到kill的目的。

 

另外还有一种更容易理解的flag置位的实现方式:

class KillableThread(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.stop = False

def run(self):
while not self.stop:
somefunction()

这种方式相比第一种而言,又有一点不足:kill生效的时限,最大等于somefunction执行一遍所花的时间。

而第一种方式,在下一句python语句执行时就会生效。

不过可以料想,第一种实现方式,整体的执行效率会慢一点。因为每次执行一句python语句,都会有一个判断的过程。


你可能感兴趣的:(python)