協程
又叫微執行緒
協程的本質
協程是編譯器進行的作業,他通過插入相關的代碼段能夠實作分段式的執行,重新開始的地方是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,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/263632.html
標籤:Go
上一篇:換人!golang面試官:連怎么避免記憶體逃逸都不知道?
下一篇:JVM排查問題實戰
