Python杀死一个线程的方法
在Python中停止线程的方法有多种,包括设置标志位、使用Thread.join()方法、使用Exception等。下面将详细讲解这些方法的具体实现。
1. 设置标志位
这是一种较为普遍的方法。具体实现是创建一个标志位,用于控制线程是否继续执行。线程按照循环标志位的状态来决定自己是否应该继续执行。
示例代码:
import threading
class MyThread(threading.Thread):
def __init__(self):
super(MyThread, self).__init__()
self.__flag = threading.Event() # 用于暂停和继续线程的标识位
self.__flag.set() # 设置为True
self.__running = threading.Event() # 用于停止线程的标识位
self.__running.set() # 将running设置为True
def run(self):
while self.__running.isSet():
self.__flag.wait()
# 线程执行任务的代码
def pause(self):
self.__flag.clear() # 设置为False, 让线程暂停
def resume(self):
self.__flag.set() # 设置为True, 让线程继续执行
def stop(self):
self.__flag.set() # 把线程从暂停状态恢复,如果已经暂停的话
self.__running.clear() # 设置为False
if __name__ == "__main__":
mt = MyThread()
mt.start()
# 线程开始执行任务
mt.pause() # 暂停线程
# 线程暂停执行任务
mt.resume() # 恢复线程
# 线程继续执行任务
mt.stop() # 停止线程
2. 使用Thread.join()方法
在Python当中,可以使用Thread.join()方法来停止线程。该方法将会阻塞调用线程,直到被调用的线程结束。在线程中,通过判断一个标志位是否为True来决定是否终止线程。
示例代码:
import threading
class MyThread(threading.Thread):
def __init__(self):
super(MyThread, self).__init__()
self.__flag = threading.Event() # 用于暂停和继续线程的标识位
self.__flag.set() # 设置为True
self.__running = threading.Event() # 用于停止线程的标识位
self.__running.set() # 将running设置为True
def run(self):
while self.__running.isSet():
self.__flag.wait()
# 线程执行任务的代码
def pause(self):
self.__flag.clear() # 设置为False, 让线程暂停
def resume(self):
self.__flag.set() # 设置为True, 让线程继续执行
def stop(self):
self.__flag.set() # 把线程从暂停状态恢复,如果已经暂停的话
self.__running.clear() # 设置为False
if __name__ == "__main__":
mt = MyThread()
mt.start()
# 线程开始执行任务
mt.pause() # 暂停线程
# 线程暂停执行任务
mt.resume() # 恢复线程
# 线程继续执行任务
mt.stop() # 停止线程
mt.join() # 调用线程join方法,等待线程执行完毕后再结束程序
使用Thread.join()方法停止线程的方式比较直观,但是需要注意的是,一旦调用join()方法,则当前线程将会阻塞,等待子线程执行完毕。因此,在使用join()方法停止线程时,建议将join()方法放在最后一行。