1. 程式人生 > >Python進階之CPU計算密集型和IO密集型

Python進階之CPU計算密集型和IO密集型

在最近往伺服器部署爬蟲程式的時候,遇到了一個很奇怪的問題,就是部署上之後執行一段時間或者是直接不執行就進入休眠狀態了,開始一直懷疑是由於伺服器記憶體不足導致的程式休眠,後來廢了好大的勁,最終找到了罪魁禍首,具體分析我通過這幾篇連載的部落格來分析一下,正好也對給自己充充電。

第一種任務的型別是計算密集型任務,其特點是要進行大量的計算,消耗CPU資源,比如計算圓周率、對視訊進行高清解碼等等,全靠CPU的運算能力。這種計算密集型任務雖然也可以用多工完成,但是任務越多,花在任務切換的時間就越多,CPU執行任務的效率就越低,所以,要最高效地利用CPU,計算密集型任務同時進行的數量應當等於CPU的核心數。

計算密集型任務由於主要消耗CPU資源,因此,程式碼執行效率至關重要。Python這樣的指令碼語言執行效率很低,完全不適合計算密集型任務。對於計算密集型任務,最好用C語言編寫。

第二種任務的型別是IO密集型,涉及到網路、磁碟IO的任務都是IO密集型任務,這類任務的特點是CPU消耗很少,任務的大部分時間都在等待IO操作完成(因為IO的速度遠遠低於CPU和記憶體的速度)。對於IO密集型任務,任務越多,CPU效率越高,但也有一個限度。常見的大部分任務都是IO密集型任務,比如Web應用。

IO密集型任務執行期間,99%的時間都花在IO上,花在CPU上的時間很少,因此,用執行速度極快的C語言替換用Python這樣執行速度極低的指令碼語言,完全無法提升執行效率。對於IO密集型任務,最合適的語言就是開發效率最高(程式碼量最少)的語言,指令碼語言是首選,C語言最差。

關於Python對這兩種任務型別的使用請參見這篇部落格:python進階之程序、執行緒和協程在實際應用中的問題