2015-11-21 178 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