【问题标题】:Correct avoiding R/W file deadlock正确避免 R/W 文件死锁
【发布时间】:2015-11-21 14:47:53
【问题描述】:

Python 脚本创建子进程 proc = subprocess.Popen(),它每隔约 1 秒向 p.txt 写入几行。我想在proc 运行时实时处理此脚本中的p.txt 更新。

...
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)
...

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

【问题讨论】:

  • 我认为yeild 是一个错字?

标签: python file python-3.x deadlock


【解决方案1】:

我怀疑这是死锁,一旦它在写入文件的过程之前就开始旋转。

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

【讨论】:

  • 注意:我不能排除死锁,但正如所写的那样,您似乎没有使用该过程的标准句柄;您实际上不能在普通文件读取时“死锁”(它要么工作要么达到 EOF,它不会阻止等待文件增长)。
  • 在大多数情况下,生成器可以长时间正常工作。但每周一次脚本在seek_file 冻结并停止子流程执行(更新p.txt)。
猜你喜欢
  • 2017-12-17
  • 1970-01-01
  • 1970-01-01
  • 2020-10-25
  • 2012-10-30
  • 1970-01-01
  • 1970-01-01
  • 2013-06-07
  • 2013-07-24
相关资源
最近更新 更多