多程序和多執行緒,這是實現多工最常用的兩種方式。
首先,要實現多工,通常我們會設計master-worker模式,master負責分配任務,worker負責執行任務,因此,多工環境下,通常是乙個master,多個worker。
如果用多程序實現master-worker,主程序就是master,其他程序就是worker。
如果用多執行緒實現master-worker,主線程就是master,其他執行緒就是worker。
多程序模式最大的優點就是穩定性高,因為乙個子程序崩潰了,不會影響主程序和其他子程序。(當然主程序掛了所有程序就全掛了,但是master程序只負責分配任務,掛掉的概率低)著名的apache最早就是採用多程序模式。
多程序模式的缺點是建立程序的代價大,在unix/linux系統下,用fork呼叫還行,在windows下建立程序開銷巨大。另外,作業系統能同時執行的程序數也是有限的,在記憶體和cpu的限制下,如果有幾千個程序同時執行,作業系統連排程都會成問題。
無論是多程序還是多執行緒,只要數量一多,效率肯定上不去,為什麼呢?
我們打個比方,假設你不幸正在準備中考,每天晚上需要做語文、數學、英語、物理、化學這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語言,單執行緒的非同步程式設計模型稱為協程,有了協程的支援,就可以基於事件驅動編寫高效的多工程式。
Py中程序與執行緒
實現程序 import multiprocessing as mp def washer dishes,output for dish in dishes print washing dish,dish output.put dish def dryer input while true dish ...
程序與執行緒
程序 process 管理單元,管理分配應用程式的資料,的記憶體空間.執行緒 thread 執行單元,執行緒負責執行乙個預先編排好的 段,執行 棧是基於執行緒的.乙個應用程式啟動的時候,程序自動建立,並且會預設建立主線程,主線程負責執行main 方法.thread t new thread new ...
程序與執行緒
程序 是擁有資源的實體,包括 1。乙個程序有乙個虛擬位址空間,不同程序位於不同的 虛擬位址空間中。程序之間若要通訊,必須通過作業系統 的功能呼叫 ipc 2。程序擁有其他資源,例如開啟的檔案和i o裝置。程序結束時,作業系統會自動釋放該程序擁有的所有資源。例如,如果 open乙個檔案而不close它...