如何在Python的getter函数中终止两个线程?
解决方案:用线程安全的标志优雅终止线程
Python线程没有提供安全的强制终止方法(比如terminate()),强制终止可能引发资源泄漏、数据不一致等问题,因此推荐使用线程安全的事件标志来控制线程退出。以下是适配需求的修改实现:
修改后的代码
import time import threading # 创建线程安全的事件对象,用于传递退出信号 exit_event = threading.Event() def printer(): # 循环条件改为监听事件状态 while not exit_event.is_set(): print("Message") # 用wait替代sleep,事件触发时可立即唤醒线程,无需等待满30秒 exit_event.wait(30) def getter(): while not exit_event.is_set(): text = str(input()) if text == "sample_text": print("It's sample text") # 设置事件,通知所有线程退出 exit_event.set() # 退出当前循环,结束getter线程 break thread1 = threading.Thread(target=printer) thread1.start() thread2 = threading.Thread(target=getter) thread2.start() # 主线程等待子线程完全结束后再退出 thread1.join() thread2.join()
核心逻辑说明
threading.Event():这是线程间安全通信的轻量机制,is_set()用于检查退出信号是否触发,set()触发退出信号,wait(timeout)会阻塞到信号触发或超时,相比time.sleep()能让printer线程立即响应退出指令。- 循环控制:两个线程的循环都依赖
exit_event.is_set()的状态,信号触发后,循环会在下一次检查时自然退出。 - 主线程等待:通过
join()让主线程等待子线程执行完毕,避免子线程被系统强制终止。
内容的提问来源于stack exchange,提问作者Stupid Hub
相关产品推荐
相关产品推荐

