subprocess.stdout.read()導致程序死鎖的問題解決
今天有位老哥聯系我說,在我的python之路系列中,解決粘包問題那一章的代碼有BUG
這里當運行命令過於龐大的時候,會導致程序直接卡死在這里,我自己試試了下,確實有這個問題。
但是到底是為什么呢,前前后后想了好久,沒找到答案,后來google了半天以及翻了下官方文檔
終於找到了問題所在!!!划重點
如果設置了stdout或stderr,subprocess就會調用os.pipe創建一個管道用於其和子進程之間的通信,而上面的問題正好是cmd輸出的數據把pipe塞滿,無法繼續往pipe里寫入數據導致程序hang住,而我們沒有去讀出pipe數據,而是死等子進程完成,導致死鎖。
具體大小的話windows只有4kb,而linux有64kb(辣雞windows)
那么如何解決呢
解決辦法一:
使用communicate及時讀出pipe中內容,避免堵死,但在輸出量非常大的情況下會影響性能:
這也是官方文檔里推薦的做法,但是不能亂用,因為會影響性能.
解決辦法二:
使用文件代替PIPE,但是這樣子的話傳給客戶端的就只能是文件了。
fdout = open(len(procs)+".out", 'w')
fderr = open(len(procs)+".err", 'w')
總結:
兩種方法需要自己根據情況進行取舍,都有各自的優勢和劣勢。