如何通过线程实时监测文件值并立即中断Python循环?
问题描述
需要实现两个线程:
- 一个线程持续监测文本文件中的值
- 另一个线程执行循环内代码;当文件值改变时,无论循环执行到哪一步,都立即中断循环并执行else语句
原Python3代码如下:
import threading import time text_list = ['a'] def readfile(): global text_list while True: with open("data.txt") as f: text_list = f.readlines() # 移除换行符 text_list = [x.strip() for x in text_list] def printloop(): while str(text_list[0]) == 'a': for n in range(0,5): print('File Character: '+str(text_list[0])+', Iteration: '+str(n)) time.sleep(5) else: print('File Character: '+str(text_list[0])+', Loop Broken') t1 = threading.Thread(target=readfile, daemon=True) t2 = threading.Thread(target=printloop) t1.start() t2.start()
data.txt初始内容:
a
当前问题:执行代码时必须等待time.sleep(5)完成才能响应文件值的变化,不想缩短sleep时间或改用类似Arduino mills()的计时方式,询问是否有可行解决方案。
解决方案
可以用threading.Event实现可中断的等待逻辑,替代time.sleep,让线程能在文件值变化时立即被唤醒并终止循环。
修改后的代码如下:
import threading import time text_list = ['a'] # 创建事件用于线程间中断信号传递 stop_event = threading.Event() def readfile(): global text_list while True: with open("data.txt") as f: new_content = f.readlines() new_content = [x.strip() for x in new_content] # 仅当文件内容确实变化时更新并触发事件 if new_content != text_list: text_list = new_content stop_event.set() time.sleep(0.1) # 降低文件读取频率,减少IO开销 def printloop(): while str(text_list[0]) == 'a': for n in range(0,5): # 先检查值是否已变化,避免无效执行 if str(text_list[0]) != 'a': break print(f'File Character: {text_list[0]}, Iteration: {n}') # 用Event.wait替代sleep,最多等待5秒,事件触发则立即返回 stop_event.wait(5) stop_event.clear() # 再次检查值状态,确保不会错过变化 if str(text_list[0]) != 'a': break else: print(f'File Character: {text_list[0]}, Loop Broken') t1 = threading.Thread(target=readfile, daemon=True) t2 = threading.Thread(target=printloop) t1.start() t2.start()
关键改动说明
- 新增
stop_event作为线程间通信的信号,文件内容变化时,读取线程会触发该事件唤醒执行线程 - 将
time.sleep(5)替换为stop_event.wait(5),该方法会等待指定时长,若期间事件被触发则立即结束等待 - 在等待前后都增加文件值检查,确保一旦值发生变化就能立刻终止循环
- 读取线程增加内容变化判断,避免频繁更新和触发事件,同时降低文件读取频率以减少系统资源消耗
这样修改后,无需缩短等待时间,文件值改变时执行线程会最快响应,立即中断循环并执行else语句。
内容的提问来源于stack exchange,提问作者Nau
相关产品推荐
相关产品推荐

