多進程程式設計和多錢程程式設計,都可以使用並行機制來提升系統的執行效率。二者的區別在於執行時所佔的記憶體分布不同,多錢程是共用一套記憶體的程式碼塊區間;而多進程是各用一套獨立的記憶體區間。
多進程的優點是穩定性好,一個子進程崩潰了,不會影響主進程以及其餘進程。基於這個特性,常常會用多進程來實現守護伺服器的功能。
多進程程式設計也有不足,即建立進程的代價非常大,因為作業系統要給每個進程分配固定的資源,並且作業系統對進程的總數會有一定的限制,若進程過多,作業系統排程都會存在問題,會造成假死狀態。
多執行緒程式設計的優點是效率較高一些,適用於批次處理任務等功能;不足之處在於,任何一個執行緒崩潰都可能造成整個進程的崩潰,因為它們共用了進程的記憶體資源池。
既然多執行緒程式設計和多進程程式設計各有優缺點,因此它們分別適用於不同的場景。比如說,對於計算密集型的任務,多進程效率會更高一下;而對於IO密集型的任務(比如檔案操作,網路爬蟲),採用多執行緒程式設計效率更高。為什麼是這樣呢?
其實也不難理解。對於 IO 密集型操作,大部分消耗時間其實是等待時間,在等待時間中,Python會釋放GIL供新的執行緒使用,實現了執行緒間的切換;相反對於 CPU 密集型程式碼,2 個 CPU 幹活肯定比一個 CPU 快很多。
在大型的計算機叢集系統中,通常都會將多進程程式分布執行在不同的計算機上協同工作。而每一台計算機上的進程內部,又會由多個執行緒來並行工作。
注意,對於任務數來說,無論是多進程程式設計或者多執行緒程式設計,其進程數或執行緒數都不能太多:
-
對於多進程程式設計來說,作業系統在切換任務時,會有一系列的保護現場措施,這要花費相當多的系統資源,若任務過多,則大部分資源都被用做乾這些了,結果就是所有任務都做不好;
-
多執行緒程式設計也不是執行緒個數越多效率越高,通過下面的公式可以計算出執行緒數量最優的一個參考值。