協程
又叫微線程程序員
協程的本質
協程是編譯器進行的工做,他經過插入相關的代碼段可以實現分段式的執行,從新開始的地方是yield關鍵字指定的,一次必定會跑到一個yield對應的地方。
協程的原理是將事件回調進行了隱藏封裝,本質上仍是異步非阻塞。利用同步的思想進行異步編程。編程
協程的工做
協程的調度是在一個線程裏面發生的,不須要操做系統內核的調度。
進行協程編程不須要加鎖,只要加一個狀態位進行判斷。多線程
### 協程的特色 沒法利用多CPU
只能有程序員調用執行,系統沒法調用
執行過程當中能隨時中斷,切換其餘協程執行
協程切換CPU消耗幾乎能夠忽略不記
協程只有在等待IO的過程當中才能重複利用線程
協程運行在線程之上,當一個協程執行完成後,能夠選擇主動讓出,讓另外一個協程運行在當前線程之上。
協程的切換在用戶態完成
不用鎖機制,因爲只有一個線程,不存在寫變量衝突
擁有掛起態,沒有超時時間
Go語言的協程
派出了被系統調用阻塞的線程,靠通道進行通訊。多線程下,爲了保護數據會對通道加鎖。 線程的執行老是趨向於CPU受限或者IO受限,而調度器會讓IO受限具備更高的優先級。 Go 中 M表明machine表明一個內核線程,P表明Processor,P表明了一個M的所需上下文。 G表明協程,表明了一段須要被併發執行的Go語言代碼的封裝。 G的運行環境有一個M和一個P組成。 P擁有一個就緒的G隊列和一個正在運行的P,若是當前線程M被阻塞,那麼P上的協程就會被掛到另外的沒有被阻塞的線程上, 若是一個M空閒,就會週期性檢查從全局列表獲取G,或者從別的M上獲取G。