go的傳說
坊間對于Go的傳說不可謂不多,“天生支持高并發,執行速度接近C,網路服務接近Nginx……”,其它還好,唯獨難理解的是“天生支持高并發”,尤其是“天生”二字,著實讓人感到滿滿的高端和神秘,
我們先來看看在go中實作并發操作到底有多簡單,來看代碼:
func main() {
go add(3,6)
go add(1,6)
time.Sleep(time.Second)
}
func add(a int,b int) {
result := a+b
fmt.Println(result)
}
go關鍵字實作了協程開辟呼叫,如果不進行等待,主執行緒結束,協程就會馬上結束,
go的并發
其實go語言中的goroutine就是參考的(Communicating Sequential Process)模型,原始的CSP中channel里的任務都是立即執行的,而go語言為其增加了一個快取,即任務可以先暫存起來,等待執行行程準備好了再逐個按順序執行,
但其實go語言并沒有完全實作了CSP模型的所有理論,僅僅是借用了 process和channel這兩個概念,process是在go語言上的表現就是 goroutine 是實際并發執行的物體,每個物體之間是通過channel通訊來實作資料共享,
1)goroutine
Goroutine 是go實際并發執行的物體,它底層是使用協程(coroutine)實作并發,coroutine是一種運行在用戶態的用戶執行緒,go底層選擇使用coroutine的出發點是因為,它具有以下特點:
- 用戶空間 避免了內核態和用戶態的切換導致的成本
- 可以由語言和框架層進行調度
- 更小的堆疊空間允許創建大量的實體
2)channel
go中使用了 CSP中的 channel ,channel 是被單獨創建并且可以在行程之間傳遞,它的通信模式類似于 boss-worker 模式的,一個物體通過將訊息發送到channel 中,然后又監聽這個 channel 的物體處理,兩個物體之間是匿名的,這個就實作物體中間的解耦,其中 channel 是同步的一個訊息被發送到 channel 中,最終是一定要被另外的物體消費掉的,在實作原理上其實是一個阻塞的訊息佇列,
3)調度器
goroutine是在golang層面提供了調度器,在調度器加入了steal working 演算法 ,goroutine是可以被異步搶占,因此沒有函式呼叫的回圈不再對調度器造成死鎖或造成垃圾回收的大幅變慢,并且go對網路IO庫進行了封裝,屏蔽了復雜的細節,對外提供統一的語法關鍵字支持,簡化了并發程式撰寫的成本,
總結
Golang實作了 CSP 并發模型做為并發基礎,底層使用goroutine做為并發物體,goroutine非常輕量級可以創建幾十萬個物體,物體間通過 channel 繼續匿名訊息傳遞使之解耦,在語言層面實作了自動調度,這樣屏蔽了很多內部細節,對外提供簡單的語法關鍵字,大大簡化了并發編程的思維轉換和管理執行緒的復雜性,
一句話總結:go語言在設計的時候從關鍵字層面實作了多協程開發,好像語言天生支持高并發一樣,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/260113.html
標籤:區塊鏈
上一篇:論文閱讀:Local-Global Video-Text Interactions for Temporal Grounding
下一篇:Flutter中專案國際化
