您好,登錄后才能下訂單哦!
本篇內容介紹了“go語言為什么支持高并發”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
原因:go語言在設計的時候從關鍵字層面實現了多協程開發。go語言實現了CSP并發模型做為并發基礎,底層使用goroutine做為并發實體,goroutine非常輕量級可以創建幾十萬個實體;實體間通過channel繼續匿名消息傳遞使之解耦,在語言層面實現了自動調度,這樣屏蔽了很多內部細節,對外提供簡單的語法關鍵字,大大簡化了并發編程的思維轉換和管理線程的復雜性。
坊間對于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語言中的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庫進行了封裝,屏蔽了復雜的細節,對外提供統一的語法關鍵字支持,簡化了并發程序編寫的成本。
“go語言為什么支持高并發”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。