python杀死一个线程的方法

  • Post category:Python

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()方法放在最后一行。