1. 程式人生 > >Python學習筆記__10.4章 進程VS線程

Python學習筆記__10.4章 進程VS線程

編程語言 Python

# 這是學習廖雪峰老師python教程的學習筆記

1、概覽

我們介紹了多進程和多線程,這是實現多任務最常用的兩種方式。現在,我們來討論一下這兩種方式的優缺點

要實現多任務,通常我們會設計Master-Worker模式,Master負責分配任務,Worker負責執行任務,因此,多任務環境下,通常是一個Master,多個Worker。

  • 如果用多進程實現Master-Worker,主進程就是Master,其他進程就是Worker。

  • 如果用多線程實現Master-Worker,主線程就是Master,其他線程就是Worker。

1.1、多進程模式的優缺點

1)優點

穩定性高,因為一個子進程崩潰了,不會影響主進程和其他子進程。

當然主進程掛了所有進程就全掛了,但是Master進程只負責分配任務,掛掉的概率低)

2)缺點

創建進程的代價大,在Unix/Linux系統下,用fork調用還行,在Windows下創建進程開銷巨大。另外,操作系統能同時運行的進程數也是有限的,在內存和CPU的限制下,如果有幾千個進程同時運行,操作系統連調度都會成問題。

1.2、多線程模式的優缺點

1)優點

多線程模式通常比多進程快一點(只有一點點)。在Windows下,多線程的效率比多進程要高,所以微軟的IIS服務器默認采用多線程模式。

2)缺點

致命的缺點就是任何一個線程掛掉都可能直接造成整個進程崩潰,因為所有線程共享進程的內存。由於多線程存在穩定性的問題,IIS的穩定性就不如Apache。

2、進程切換和線程切換

進程切換分兩步,線程只做第2步:

  1. 切換頁目錄以使用新的地址空間

  2. 切換內核棧和硬件上下文。

線程上下文切換和進程上下文切換一個最主要的區別是線程的切換虛擬內存空間依然是相同的,但是進程切換是不同的。這兩種上下文切換的處理都是通過操作系統內核來完成的。內核的這種切換過程伴隨的最顯著的性能損耗是將寄存器中的內容切換出。

而無論進程/線程切換都要涉及到:

  1. 保存當前執行的現場環境(CPU寄存器狀態、內存頁等)

  2. 把新任務的執行環境準備好(恢復上次的寄存器狀態,切換內存頁等)

這個切換過程雖然很快,但是也需要耗費時間。如果有幾千個任務同時進行,操作系統可能就主要忙著切換任務,根本沒有多少時間去執行任務了。所以,多任務一旦多到一個限度,就會消耗掉系統所有的資源,結果效率急劇下降,所有任務都做不好。

3、計算密集型 vs. IO密集型

是否采用多任務的第二個考慮是任務的類型。我們可以把任務分為計算密集型和IO密集型

3.1、計算密集型

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

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

3.2IO密集型

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

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

4、異步IO

考慮到CPU和IO之間巨大的速度差異一個任務在執行的過程中大部分時間都在等待IO操作單進程單線程模型會導致別的任務無法並行執行,因此,我們才需要多進程模型或者多線程模型來支持多任務並發執行。

現代操作系統對IO操作已經做了巨大的改進,最大的特點就是支持異步IO。如果充分利用操作系統提供的異步IO支持,就可以用單進程單線程模型來執行多任務,這種全新的模型稱為事件驅動模型Nginx就是支持異步IO的Web服務器,它在單核CPU上采用單進程模型就可以高效地支持多任務。在多核CPU上,可以運行多個進程(數量與CPU核心數相同),充分利用多核CPU。由於系統總的進程數量十分有限,因此操作系統調度非常高效。用異步IO編程模型來實現多任務是一個主要的趨勢。

對應到Python語言,單線程的異步編程模型稱為協程,有了協程的支持,就可以基於事件驅動編寫高效的多任務程序。


Python學習筆記__10.4章 進程VS線程