我希望有一个线程不断地监视文本文件中的值的状态,另一个线程在循环中执行一些代码,我希望当文本文件中的值改变时,立即中断循环并执行else语句,而不管程序在循环中的哪个部分。有可能做到这一点吗?
这是我的Python 3代码:
import threading
import time
text_list = ['a']
def readfile():
global text_list
while True:
with open("data.txt") as f:
text_list = f.readlines()
# Removing new line "\n" character
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函数完成。我想在变量改变时中断循环。我认为一个解决方案可能是告诉time.sleep函数等待更少的时间并增加迭代次数,或者使用类似Arduino中的米尔斯()函数的东西,但我认为最好保持time.sleep函数不变,因为我的文件中的真实的循环要大得多,我使用了不止一个time.sleep函数,所以如果变量发生变化,无论它在哪个部分,是否有办法打破循环?
2条答案
按热度按时间eyh26e7m1#
首先,如果输入文件没有更改,您可能不希望无效率地连续重新读取它。根据DarkNight的建议,您可能希望查看
PyPi
存储库上的watchdog
模块。在这里,我们将只查看文件的初始修改时间,并且只在它发生更改时重新读取它(我们将每隔0.1秒检查修改时间)。其次,在原始代码中,如果另一个进程正在打开文件,则在执行任何写入之前,其长度将为0。因此,您有一个竞争条件,其中readfile
线程可能正在阅读这个长度为0的文件并相应地设置text_list
。这可能导致表达式text_list[0]
引发异常。在这里,由于我们只在修改时间发生变化时阅读文件,这似乎是 * 在 * 新数据写入和文件关闭之后,除非有两个这样的文件重写一个接一个地执行,否则这不是问题。但为了安全起见,我们仍将检查临时的0长度文件内容。您的问题的解决方案是使用一个
threading.Condition
示例,该示例表示发生了文件内容更改。线程printloop
将等待最多5秒,以使此to事件发生。如果5秒过去了或者文件发生了更改,线程将被唤醒并执行其测试。在原始代码中,即使文件已经更改,它仍然会在终止之前循环多达5次打印消息。我已经修改了代码,这样就不会发生这种情况。我将函数
readfile
重命名为monitor_file
,并创建了一个read_file
函数,monitor_file
使用该函数重新读取文件内容并返回结果。e37o9pze2#
你的程序可以通过使用看门狗简化。
您可能需要安装watchdog。例如,您可以通过运行
python -m pip install watchdog
来执行此操作。