Python的非同步檔案IO操作
阿新 • • 發佈:2019-02-06
前一篇提到了用subprocess進行與應用的stdin和stdout互動,目前還是stdout處理得多。專案有這樣的要求,需要程式碼能過同時在Linux和Windows下用,為防止應用掛起,需要進行非同步IO操作,這樣可通過timeout來處理超時。
麻煩問題又來了:Python2.7.x和Python3.2下的Popen都沒有提供基於檔案的非同步IO操作,且專案必須使用Python2.x,應為較多第三方的庫沒有Python3.x的版本。
整理了一下非同步IO的方法,其實是workaround
1,如果在Linux下,可用用select來處理超時,以此實現非同步IO;但在Windows下的select不支出file物件--只支援socket物件,這個方法可以斃掉了。
2,應用有stdout可以獲取,那麼必然可以將此stdout重定向到檔案,然後再對此檔案進行read操作。這樣對file的read就不會blocking,每讀取一行資料就進行退出條件檢查以及超時檢查,遇到EOF時可進行sleep,然後再continue,再read -- 此時應用還在向檔案寫入資料,直到滿足退出條件或者timeout。如果也需要獲取stderr的話,可以把stderr指向stdout,如 'app > output.txt 2<&1'。次方法在Linux和Windows下通用,實踐可行,目前沒發現有什麼大硬傷。
3,過載Popen,實現非同步IO操作,嘗試了下,bug多,難滿足需求,只因本人功力太淺啊。