2015-11-21 134 views
1

Python脚本创建子进程proc = subprocess.Popen(),它会在〜1秒内写入几行到p.txt。我想在proc正在运行时实时处理此脚本中的p.txt更新。正确避免R/W文件死锁

... 
def seek_file(file, process): 
    while process.poll() is None: 
     l = file.readline().strip() 
     if not l: 
      sleep(0.1) 
      continue 
     else: 
      yield tuple(l.split('=')) 
... 
p_file = open('p.txt') 
data_tuples = seek_file(p_file, proc) 
for d in data_tuples: 
    print(d) 
... 

为什么这段代码偶尔会变成死锁状态?处理经常更新的文件并显示进度的最佳方法是什么?

+0

我假设'yeild'是一个错字? – ShadowRanger

回答

1

我怀疑这是死锁,只要它在写入文件的过程之前旋转即可。

当您到达文件中的EOF时,即使随后文件增长,文件对象也不会产生新行。您可以通过执行f.seek(f.tell())来重置此行为,因为查找(到当前位置)将重置EOF指示符。

+0

注意:我不能排除死锁,但按照书面的说法,它看起来并不像您正在使用标准手柄进行操作;你不能在正常的文件读取上实际发生“死锁”(它可以工作,也可以达到EOF,它不会阻止等待文件增长)。 – ShadowRanger

+0

在大多数情况下,发电机工作很长时间。但是每周一次脚本冻结在'seek_file'并停止子进程执行(更新'p.txt')。 – Tausackhn