您的位置:

使用Python终止线程的方法

一、为什么需要终止线程

在线程编程中,有时候需要终止线程的执行。这可能是由于程序需要在某个时间点停止某个线程的执行,或者线程执行遇到错误需要被终止,或者在用户请求终止线程时需要将线程停止。无论是哪种情况,这都需要我们知道如何正确地终止线程。

二、使用stop()方式终止线程

在Python中,可以通过stop()方法来终止线程的执行,但是这种方式并不安全,因为stop()方法只是简单地终止线程的执行,会导致线程所持有的锁无法被释放,从而导致程序发生死锁。因此,我们通常不建议使用stop()方法来终止线程。

三、使用标志位终止线程

使用标志位来终止线程是一种更安全更有效的终止线程方式。一般情况下,我们为线程添加一个布尔型的标志位,判断标志位是否为真,来控制线程的执行。当标志位为假时,线程会停止执行。

import threading
import time

class myThread(threading.Thread):
    def __init__(self, threadID, name, flag):
        threading.Thread.__init__(self)
        self.threadID = threadID
        self.name = name
        self.flag = flag
    
    def run(self):
        while self.flag:
            print("Thread " + self.name + " is running...")
            time.sleep(1)
        
        print("Thread " + self.name + " stopped.")
        
    def stop(self):
        self.flag = False

t1 = myThread(1, "Thread 1", True)
t2 = myThread(2, "Thread 2", True)

t1.start()
t2.start()

time.sleep(5)

t1.stop()
t2.stop()

t1.join()
t2.join()

四、使用Thread类的事件对象终止线程

在Python的Thread类中,有一个事件对象,使用该事件对象可以控制线程的执行。当事件对象被设置为True时,线程会继续执行,当事件对象被设置为False时,线程会停止执行。

import threading
import time

class myThread(threading.Thread):
    def __init__(self, threadID, name, event):
        threading.Thread.__init__(self)
        self.threadID = threadID
        self.name = name
        self.event = event
    
    def run(self):
        while self.event.is_set():
            print("Thread " + self.name + " is running...")
            time.sleep(1)
        
        print("Thread " + self.name + " stopped.")
        
    def stop(self):
        self.event.clear()

t1_event = threading.Event()
t1 = myThread(1, "Thread 1", t1_event)
t2_event = threading.Event()
t2 = myThread(2, "Thread 2", t2_event)

t1_event.set()
t2_event.set()

t1.start()
t2.start()

time.sleep(5)

t1.stop()
t2.stop()

t1.join()
t2.join()

五、使用Thread类的terminate()方法终止线程

在Python3的Thread类中,有一个terminate()方法可以用来终止线程的执行。该方法会引发一个SystemExit异常,从而安全地退出线程。

import threading
import time

class myThread(threading.Thread):
    def __init__(self, threadID, name):
        threading.Thread.__init__(self)
        self.threadID = threadID
        self.name = name
    
    def run(self):
        while True:
            print("Thread " + self.name + " is running...")
            time.sleep(1)
        
    def stop(self):
        pass

t1 = myThread(1, "Thread 1")
t2 = myThread(2, "Thread 2")

t1.start()
t2.start()

time.sleep(5)

t1.terminate()
t2.terminate()

t1.join()
t2.join()