1. 程式人生 > >對協程的理解

對協程的理解

對於作業系統來說,協程其實是一種特殊的執行緒,對於CPU來說,協程是非搶佔式(程序和執行緒是搶佔式的),實現機理如下:

有兩個function:A, B, A呼叫B,B要執行一段時間,很晚才返回,A不會因為等B而一直佔用CPU,即A是非阻塞的。B返回後,A又能繼續執行。神奇的是,A和B又是走在一條獨木橋(橋上並行只能走一條執行緒或者程序)上的,即A和B是一體的(和執行緒,程序同一級別)。那麼有人會問,B要執行很久,B不就阻塞了嗎,既然AB一體,B阻塞,不就是A阻塞嗎?重要的來了:B是阻塞的,但是B並不是阻塞CPU,B阻塞的是除了CPU以外的資源,比如硬碟(慢)。所以,AB並不會阻塞CPU。這裡,AB就是協程。

比較一下執行緒,又有兩個function:C,D,C執行很快,D要去讀硬碟,那麼如果CD一體,是一個執行緒,那麼C一定會等D(因為執行緒是CPU搶佔式的),那麼CD就是堵塞的了。

所以,可以看到,協程適合用在多IO,比如Web後臺,每個使用者來了都要讀資料庫,我們不能讓每個使用者來到離開一直佔領著CPU,這時候用協程就解決了。

這時,又有人說了,可以用多執行緒來實現AB啊。是可以,但是多執行緒就涉及到共享衝突的問題,最經典的是生產者消費者模型。


貼來一段別人比較好的解釋:

Coroutine,翻譯成”協程“,初始碰到的人馬上就會跟程序和執行緒兩個概念聯絡起來。直接先說區別,Coroutine是編譯器級的,Process和Thread是作業系統級的。Coroutine的實現,通常是對某個語言做相應的提議,然後通過後成編譯器標準,然後編譯器廠商來實現該機制。Process和Thread看起來也在語言層次,但是內生原理卻是作業系統先有這個東西,然後通過一定的API暴露給使用者使用,兩者在這裡有不同。Process和Thread是os通過排程演算法,儲存當前的上下文,然後從上次暫停的地方再次開始計算,重新開始的地方不可預期,每次CPU計算的指令數量和程式碼跑過的CPU時間是相關的,跑到os分配的cpu時間到達後就會被os強制掛起。Coroutine是編譯器的魔術,通過插入相關的程式碼使得程式碼段能夠實現分段式的執行,重新開始的地方是yield關鍵字指定的,一次一定會跑到一個yield對應的地方。