對協程的理解

2021-08-04 12:36:41 字數 995 閱讀 1877

對於作業系統來說,協程其實是一種特殊的執行緒,對於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對應的地方。

對協程的理解

實現併發,可以使用多程序,多執行緒。程序和執行緒有個共同點,他們都是通過作業系統來排程的。而協程,則把排程的權力交給了程式設計師。協程可以看作使用者態下協作的執行緒。使用者態 是說協程的排程權屬於程式設計師。協作 是說協程的排程是協作式的,不是搶占的。在協程中,某部分可以通過呼叫某個方法,將控制權交...

python 協程 理解

協程的使用依賴於gevent 它封裝了greenlet 在使用的時候 主要是切斷當前程式執行,然後當收到訊號再次執行程式。在中斷中可以進行其它任務。程式import gevent def foo print running in foo gevent.sleep 0 print explicit c...

golang 協程理解

本文總結一下go協程的理解,如有錯誤望請指正。網上都說協程是一種輕量級執行緒,執行緒又是一種輕量級的程序。這話在語言層面看來是沒有錯的,但它們的實現是不同的。執行緒是cpu資源排程的最小單位。協程不由cpu進行排程,由應用程式進行排程,也就是由go進行排程。在go中,協程的排程也有專門的排程器。但g...