Python - 中断线程



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

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

使用 Event 对象的线程中断

中断线程的一种简单方法是使用线程Event 类。此类允许一个线程向另一个线程发出特定事件已发生的信号。下面介绍如何使用 threading 实现线程中断。事件

在此示例中,我们有一个 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

使用 Flag 的线程中断

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

此示例演示如何在 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.