2017-06-28 52 views
1

我希望我的程序等到特定文件包含文本而不是空字符串。另一個程序將數據寫入文件。當我運行第一個程序時,由於持續檢查文件內容的while循環,我的電腦開始過熱。我能做什麼而不是那個循環?Python等待事件的其他方式

+0

你可以編寫一個服務作爲第一個程序。第二個方案將成爲客戶。當客戶端在文件中完成寫入時,它可以向服務發送一些請求以採取必要的操作。 –

+1

不幸的是,我認爲你必須不斷檢查文件內容。一個選項是執行time.sleep命令,以便不燒壞你的cpu或使用cron作業。兩者基本上都是在文件檢查之間等待的相同實現。 – Sebastian

+1

pyinotify監控文件系統 - https://www.saltycrane.com/blog/2010/04/monitoring-filesystem-python-and-pyinotify/?或使用看門狗 - https://pythonhosted.org/watchdog/? –

回答

1

一個更好的解決辦法是從你的Python腳本內啓動過程:

from subprocess import call 
retcode = call(['myprocess', 'arg1', 'arg2', 'argN']) 

檢查retcode是零,這意味着成功 - 你的過程中,沒有任何問題成功運行。您也可以使用os.system而不是subprocess.call。一旦這個過程完成,你就會知道現在你可以讀取文件。

爲什麼這種方法比監控文件更好?

  • 的過程可能失敗,有可能是文件中沒有輸出你想從閱讀。 在這種情況下,您的進程將一次又一次地檢查文件,查找數據,這會浪費內核I/O操作時間。沒有什麼能夠保證過程在任何時候都能成功。

  • 過程可接收信號,(I,E。STOPCONT),如果進程收到STOP信號,內核將停止這一進程,並有可能是什麼,你可以從輸出文件中讀取,特別是如果你打算一次讀取所有的數據,比如當你排序文件時。一旦過程接收到CONT信號,過程將再次開始。基本上,這意味着當進程停止時,您的Python腳本將嘗試從文件中同時讀取。

該方法的缺點是,該進程需要在Python腳本處理文件輸出之前先完成。在subprocess.call塊中,下一行將不會由Python解釋器執行,直到生成的進程完成第一次,您可以改爲使用非阻塞的subprocess.Popen。甚至更好,如果可能,將進程的輸出重定向到標準輸出,並使用Popen從標準輸出中讀取進程的輸出,然後將Python腳本的輸出寫入文件。