Python - 中断线程



在多线程编程中,中断线程是在特定条件下需要终止线程执行的常见需求。在多线程程序中,可能需要停止新线程中的任务。这可能是由于多种原因,例如:任务完成、应用程序关闭或其他外部条件。

在 Python 中,可以使用threading.Event 或在线程本身中设置终止标志来中断线程。这些方法允许您有效地中断线程,确保资源得到正确释放并且线程干净地退出。

使用事件对象中断线程

中断线程的一种直接方法是使用threading.Event 类。此类允许一个线程向另一个线程发出特定事件已发生的信号。以下是如何使用 threading.Event 实现线程中断:

示例

在这个例子中,我们有一个 MyThread 类。它的对象开始执行 run() 方法。主线程休眠一段时间,然后设置一个事件。在检测到事件之前,run() 方法中的循环会继续执行。一旦检测到事件,循环就会终止。

from time import sleep
from threading import Thread
from threading import Event

class MyThread(Thread):
   def __init__(self, event):
      super(MyThread, self).__init__()
      self.event = event

   def run(self):
      i=0
      while True:
         i+=1
         print ('Child thread running...',i)
         sleep(0.5)
         if self.event.is_set():
            break
         print()
      print('Child Thread Interrupted')

event = Event()
thread1 = MyThread(event)
thread1.start()

sleep(3)
print('Main thread stopping child thread')
event.set()
thread1.join()

执行此代码时,将产生以下输出

Child thread running... 1
Child thread running... 2
Child thread running... 3
Child thread running... 4
Child thread running... 5
Child thread running... 6
Main thread stopping child thread
Child Thread Interrupted

使用标志中断线程

中断线程的另一种方法是使用线程定期检查的标志。此方法涉及在线程对象中设置标志属性,并在线程的执行循环中定期检查其值。

示例

此示例演示了如何在 Python 多线程程序中使用标志来控制和停止正在运行的线程。

import threading
import time

def foo():
    t = threading.current_thread()
    while getattr(t, "do_run", True):
        print("working on a task")
        time.sleep(1)
    print("Stopping the Thread after some time.")

# Create a thread
t = threading.Thread(target=foo)
t.start()

# Allow the thread to run for 5 seconds
time.sleep(5)

# Set the termination flag to stop the thread
t.do_run = False

执行此代码时,将产生以下输出

working on a task
working on a task
working on a task
working on a task
working on a task
Stopping the Thread after some time.
广告