Python:關於subprocess.stdout.read()導致程序死鎖的問題


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

 

 

總結:

兩種方法需要自己根據情況進行取舍,都有各自的優勢和劣勢。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM