You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过线程实时监测文件值并立即中断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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 01:28:28