1. 程式人生 > >程序執行緒協程區別

程序執行緒協程區別

現在多程序多執行緒已經是老生常談了,協程也在最近幾年流行起來。python中有協程庫gevent,py web框架tornado中也用了gevent封裝好的協程。本文主要介紹程序、執行緒和協程三者之間的區別。

一、概念

  1、程序

程序是具有一定獨立功能的程式關於某個資料集合上的一次執行活動,程序是系統進行資源分配和排程的一個獨立單位。每個程序都有自己的獨立記憶體空間,不同程序通過程序間通訊來通訊。由於程序比較重量,佔據獨立的記憶體,所以上下文程序間的切換開銷(棧、暫存器、虛擬記憶體、檔案控制代碼等)比較大,但相對比較穩定安全。

  2、執行緒

執行緒是程序的一個實體,是CPU排程和分派的基本單位,它是比程序更小的能獨立執行的基本單位.執行緒自己基本上不擁有系統資源,只擁有一點在執行中必不可少的資源(如程式計數器,一組暫存器和棧),但是它可與同屬一個程序的其他的執行緒共享程序所擁有的全部資源。執行緒間通訊主要通過共享記憶體,上下文切換很快,資源開銷較少,但相比程序不夠穩定容易丟失資料。

  3、協程

協程是一種使用者態的輕量級執行緒,協程的排程完全由使用者控制。協程擁有自己的暫存器上下文和棧。協程排程切換時,將暫存器上下文和棧儲存到其他地方,在切回來的時候,恢復先前儲存的暫存器上下文和棧,直接操作棧則基本沒有核心切換的開銷,可以不加鎖的訪問全域性變數,所以上下文的切換非常快。

 

二、區別:

  1、程序多與執行緒比較

執行緒是指程序內的一個執行單元,也是程序內的可排程實體。執行緒與程序的區別:
1) 地址空間:執行緒是程序內的一個執行單元,程序內至少有一個執行緒,它們共享程序的地址空間,而程序有自己獨立的地址空間
2) 資源擁有:程序是資源分配和擁有的單位,同一個程序內的執行緒共享程序的資源
3) 執行緒是處理器排程的基本單位,但程序不是
4) 二者均可併發執行

5) 每個獨立的執行緒有一個程式執行的入口、順序執行序列和程式的出口,但是執行緒不能夠獨立執行,必須依存在應用程式中,由應用程式提供多個執行緒執行控制

  2、協程多與執行緒進行比較

1) 一個執行緒可以多個協程,一個程序也可以單獨擁有多個協程,這樣python中則能使用多核CPU。

2) 執行緒程序都是同步機制,而協程則是非同步

3) 協程能保留上一次呼叫時的狀態,每次過程重入時,就相當於進入上一次呼叫的狀態

 

 三、程序和執行緒、協程在python中的使用

  1、多程序一般使用multiprocessing庫,來利用多核CPU,主要是用在CPU密集型的程式上,當然生產者消費者這種也可以使用。多程序的優勢就是一個子程序崩潰並不會影響其他子程序和主程序的執行,但缺點就是不能一次性啟動太多程序,會嚴重影響系統的資源排程,特別是CPU使用率和負載。使用多程序可以檢視文章《

python 多程序使用總結》。注:python2的程序池在類中的使用會有問題,需要把類函式定義成全域性函式。具體可參考 http://bbs.chinaunix.net/thread-4111379-1-1.html

  2、多執行緒一般是使用threading庫,完成一些IO密集型併發操作。多執行緒的優勢是切換快,資源消耗低,但一個執行緒掛掉則會影響到所有執行緒,所以不夠穩定。現實中使用執行緒池的場景會比較多,具體可參考《python執行緒池實現》。

  3、協程一般是使用gevent庫,當然這個庫用起來比較麻煩,所以使用的並不是很多。相反,協程在tornado的運用就多得多了,使用協程讓tornado做到單執行緒非同步,據說還能解決C10K的問題。所以協程使用的地方最多的是在web應用上。

總結一下就是IO密集型一般使用多執行緒或者多程序,CPU密集型一般使用多程序,強調非阻塞非同步併發的一般都是使用協程,當然有時候也是需要多程序執行緒池結合的,或者是其他組合方式。