Python如何中断线程?

我试过interrupt和stop显示Thread没有attribute.
关注者
5
被浏览
7,518

4 个回答

Python中的线程可以通过设置一个标志变量来中止。当线程检测到这个标志变量时,它可以自行停止执行。以下是一种简单的中断线程的方法:


首先,定义一个标志变量,在需要中断线程时设置它的值:

import threading


class MyThread(threading.Thread):

def __init__(self):

super(MyThread, self).__init__()

self._stop_event = threading.Event()


def stop(self):

self._stop_event.set()


def run(self):

while not self._stop_event.is_set():

# 代码逻辑


在需要停止线程的位置中调用该线程的stop方法,设置标志变量:

my_thread = MyThread()

my_thread.start() # 启动线程

# 中间某些操作

my_thread.stop() # 停止线程

my_thread.join() # 等待线程结束



在这个例子中,MyThread继承自threading.Thread,并使用了一个Event对象创建了一个叫做_stop_event的标志变量。在线程执行期间,使用_stop_event.is_set()检查标志变量的状态。如果标志变量设置为True,线程就会停止。


使用这种方法能够对线程进行强制终止,因为它会在下一个轮询时检查标志变量并停止执行。然而,这种方法对于在安全点中断线程或对线程对象的清理和终止处理等操作并不可行。因此,建议在设计线程时尽量避免中断线程的情况,而是通过设计实现一种可以优雅退出线程的模式。

你可以使用Python的内置模块 threading 来创建和管理线程,并且提供了多种中断线程的方法,具体如下:

  1. 设置线程的标志位,在循环内判断标志位并安全地退出线程。例如,可以定义一个Boolean类型的实例变量作为线程的标志位,线程在运行时根据标志位决定是否继续执行。
  2. 调用线程对象的 join(timeout) 方法等待线程结束,在超时时间内线程未结束则强制终止该线程。此方法对于需要等待线程完成任务的情况十分有用。
  3. 使用 Thread.interrupt_main() 方法请求主线程中断正在运行的线程。然而该方法只适用于主线程中调用,会抛出 KeyboardInterrupt 异常以终止线程。

需要注意的是,在线程运行期间不要直接使用 Thread.terminate() 或者是 os._exit() 等强制终止线程的方法,因为它们可能导致资源泄漏和数据不一致等问题