什麼是協程,及於程序和執行緒比得優缺點

2021-09-28 16:07:01 字數 1135 閱讀 7107

協程,又稱微執行緒,纖程。英文名coroutine。

協程的概念很早就提出來了,但直到最近幾年才在某些語言(如lua)中得到廣泛應用。

子程式,或者稱為函式,在所有語言中都是層級呼叫,比如a呼叫b,b在執行過程中又呼叫了c,c執行完畢返回,b執行完畢返回,最後是a執行完畢。

所以子程式呼叫是通過棧實現的,乙個執行緒就是執行乙個子程式。

子程式呼叫總是乙個入口,一次返回,呼叫順序是明確的。而協程的呼叫和子程式不同。

協程看上去也是子程式,但執行過程中,在子程式內部可中斷,然後轉而執行別的子程式,在適當的時候再返回來接著執行。

注意,在乙個子程式中中斷,去執行其他子程式,不是函式呼叫,有點類似cpu的中斷。比如子程式a、b:

def a():

print '1'

print '2'

print '3'

def b():

print 'x'

print 'y'

print 'z'

假設由協程執行,在執行a的過程中,可以隨時中斷,去執行b,b也可能在執行過程中中斷再去執行a,結果可能是:

12x

y3z

但是在a中是沒有呼叫b的,所以協程的呼叫比函式呼叫理解起來要難一些。

看起來a、b的執行有點像多執行緒,但協程的特點在於是乙個執行緒執行,那和多執行緒比,協程有何優勢?

最大的優勢就是協程極高的執行效率。因為子程式切換不是執行緒切換,而是由程式自身控制,因此,沒有執行緒切換的開銷,和多執行緒比,執行緒數量越多,協程的效能優勢就越明顯。

第二大優勢就是不需要多執行緒的鎖機制,因為只有乙個執行緒,也不存在同時寫變數衝突,在協程中控制共享資源不加鎖,只需要判斷狀態就好了,所以執行效率比多執行緒高很多。

因為協程是乙個執行緒執行,那怎麼利用多核cpu呢?最簡單的方法是多程序+協程,既充分利用多核,又充分發揮協程的高效率,可獲得極高的效能。

協程並不是切換的執行緒 而是切的自身內部的程式!

舉個簡單的例子:

用協程並不會 提高(單)sql執行速度。 而是多個任務(譬如多個sql執行步驟)可以併發執行

譬如 /news/123

其中你要取 3張表的資料(假設不能關聯)。那麼傳統做法 要等第一張表取完再取第二個。 協程可以「一起」取

程序和執行緒 協程的區別

現在多程序多執行緒已經是老生常談了,協程也在最近幾年流行起來。python中有協程庫gevent,py web框架tornado中也用了gevent封裝好的協程。本文主要介紹程序 執行緒和協程三者之間的區別。一 概念 1 程序 程序是具有一定獨立功能的程式關於某個資料集合上的一次執行活動,程序是系統...

程序和執行緒 協程的區別

現在多程序多執行緒已經是老生常談了,協程也在最近幾年流行起來。python中有協程庫gevent,py web框架tornado中也用了gevent封裝好的協程。本文主要介紹程序 執行緒和協程三者之間的區別。一 概念 1 程序 程序是具有一定獨立功能的程式關於某個資料集合上的一次執行活動,程序是系統...

深入理解 執行緒,程序,協程和並行,併發 協程

爬蟲的併發控制 多程序 多執行緒 協程 yield 從硬體 雙核四執行緒 超執行緒技術 有兩個cpu核心,每個核心有兩個邏輯處理器,相當於有四個cpu核心 四核四執行緒 有乙個cpu核心,每個核心有乙個邏輯處理器,相當於有四個cpu核心 從作業系統 程序和執行緒,都是cpu任務的執行單位。程序 早期...