Python筆記 程序和執行緒的優缺點

2021-08-28 02:27:18 字數 2144 閱讀 7632

我們介紹了多程序和多執行緒,這是實現多工最常用的兩種方式。現在,我們來討論一下這兩種方式的優缺點。

首先,要實現多工,通常我們會設計master-worker模式,master負責分配任務,worker負責執行任務,因此,多工環境下,通常是乙個master,多個worker。

如果用多程序實現master-worker,主程序就是master,其他程序就是worker。

如果用多執行緒實現master-worker,主線程就是master,其他執行緒就是worker。

多程序模式最大的優點就是穩定性高,因為乙個子程序崩潰了,不會影響主程序和其他子程序。(當然主程序掛了所有程序就全掛了,但是master程序只負責分配任務,掛掉的概率低)著名的apache最早就是採用多程序模式。

多程序模式的缺點是建立程序的代價大,在unix/linux系統下,用fork呼叫還行,在windows下建立程序開銷巨大。另外,作業系統能同時執行的程序數也是有限的,在記憶體和cpu的限制下,如果有幾千個程序同時執行,作業系統連排程都會成問題。

在windows下,多執行緒的效率比多程序要高,所以微軟的iis伺服器預設採用多執行緒模式。由於多執行緒存在穩定性的問題,iis的穩定性就不如apache。為了緩解這個問題,iis和apache現在又有多程序+多執行緒的混合模式,真是把問題越搞越複雜。

無論是多程序還是多執行緒,只要數量一多,效率肯定上不去,為什麼呢?

我們打個比方,假設你不幸正在準備中考,每天晚上需要做語文、數學、英語、物理、化學這5科的作業,每項作業耗時1小時。

如果你先花1小時做語文作業,做完了,再花1小時做數學作業,這樣,依次全部做完,一共花5小時,這種方式稱為單任務模型,或者批處理任務模型。

假設你打算切換到多任務模型,可以先做1分鐘語文,再切換到數學作業,做1分鐘,再切換到英語,以此類推,只要切換速度足夠快,這種方式就和單核cpu執行多工是一樣的了,以幼兒園小朋友的眼光來看,你就正在同時寫5科作業。

但是,切換作業是有代價的,比如從語文切到數學,要先收拾桌子上的語文書本、鋼筆(這叫儲存現場),然後,開啟數學課本、找出圓規直尺(這叫準備新環境),才能開始做數學作業。作業系統在切換程序或者執行緒時也是一樣的,它需要先儲存當前執行的現場環境(cpu暫存器狀態、記憶體頁等),然後,把新任務的執行環境準備好(恢復上次的暫存器狀態,切換記憶體頁等),才能開始執行。這個切換過程雖然很快,但是也需要耗費時間。如果有幾千個任務同時進行,作業系統可能就主要忙著切換任務,根本沒有多少時間去執行任務了,這種情況最常見的就是硬碟狂響,點視窗無反應,系統處於假死狀態。

所以,多工一旦多到乙個限度,就會消耗掉系統所有的資源,結果效率急劇下降,所有任務都做不好。

是否採用多工的第二個考慮是任務的型別。我們可以把任務分為計算密集型和io密集型。

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

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

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

考慮到cpu和io之間巨大的速度差異,乙個任務在執行的過程中大部分時間都在等待io操作,單程序單執行緒模型會導致別的任務無法並行執行,因此,我們才需要多程序模型或者多執行緒模型來支援多工併發執行。

現代作業系統對io操作已經做了巨大的改進,最大的特點就是支援非同步io。如果充分利用作業系統提供的非同步io支援,就可以用單程序單執行緒模型來執行多工,這種全新的模型稱為事件驅動模型,nginx就是支援非同步io的web伺服器,它在單核cpu上採用單程序模型就可以高效地支援多工。在多核cpu上,可以執行多個程序(數量與cpu核心數相同),充分利用多核cpu。由於系統總的程序數量十分有限,因此作業系統排程非常高效。用非同步io程式設計模型來實現多工是乙個主要的趨勢。

對應到python語言,單執行緒的非同步程式設計模型稱為協程,有了協程的支援,就可以基於事件驅動編寫高效的多工程式。我們會在後面討論如何編寫協程。

python筆記 程序和執行緒 多執行緒

一 建立乙個多程序 啟動乙個執行緒就是把乙個函式傳入並建立thread例項,然後呼叫start 開始執行 1.1 及執行結果 如以上 所示,threading.current thread 返回程序例項,用threading.current thread name返回例項名稱,主線程例項的名字叫ma...

python學習筆記 程序和執行緒

對於作業系統來說,乙個任務就是乙個程序 process 比如開啟乙個瀏覽器就是啟動乙個瀏覽器程序,開啟乙個記事本就啟動了乙個記事本程序,開啟兩個記事本就啟動了兩個記事本程序,開啟乙個word就啟動了乙個word程序。有些程序還不止同時幹一件事,比如word,它可以同時進行打字 拼寫檢查 列印等事情。...

Python筆記之程序和執行緒

對於作業系統來說,乙個任務就是乙個程序 process 比如開啟乙個瀏覽器就是乙個程序,開啟兩個記事本就是兩個程序 那麼什麼是執行緒呢?我們發現,有些程序不止能做一件事,比如乙個word程序可以同時進行打字,拼寫檢查,列印等事情,也就是乙個程序可能要同時執行多個 子任務 程序內的這些子任務就稱為執行...