溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

go語言為什么支持高并發(fā)

發(fā)布時間:2022-12-27 14:21:44 來源:億速云 閱讀:127 作者:iii 欄目:編程語言

本篇內(nèi)容介紹了“go語言為什么支持高并發(fā)”的有關(guān)知識,在實(shí)際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

原因:go語言在設(shè)計(jì)的時候從關(guān)鍵字層面實(shí)現(xiàn)了多協(xié)程開發(fā)。go語言實(shí)現(xiàn)了CSP并發(fā)模型做為并發(fā)基礎(chǔ),底層使用goroutine做為并發(fā)實(shí)體,goroutine非常輕量級可以創(chuàng)建幾十萬個實(shí)體;實(shí)體間通過channel繼續(xù)匿名消息傳遞使之解耦,在語言層面實(shí)現(xiàn)了自動調(diào)度,這樣屏蔽了很多內(nèi)部細(xì)節(jié),對外提供簡單的語法關(guān)鍵字,大大簡化了并發(fā)編程的思維轉(zhuǎn)換和管理線程的復(fù)雜性。

go的傳說

坊間對于Go的傳說不可謂不多,“天生支持高并發(fā),執(zhí)行速度接近C,網(wǎng)絡(luò)服務(wù)接近Nginx……”。其它還好,唯獨(dú)難理解的是“天生支持高并發(fā)”,尤其是“天生”二字,著實(shí)讓人感到滿滿的高端和神秘。

我們先來看看在go中實(shí)現(xiàn)并發(fā)操作到底有多簡單,來看代碼:

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關(guān)鍵字實(shí)現(xiàn)了協(xié)程開辟調(diào)用,如果不進(jìn)行等待,主線程結(jié)束,協(xié)程就會馬上結(jié)束。

go的并發(fā)

其實(shí)go語言中的goroutine就是參考的(Communicating Sequential Process)模型,原始的CSP中channel里的任務(wù)都是立即執(zhí)行的,而go語言為其增加了一個緩存,即任務(wù)可以先暫存起來,等待執(zhí)行進(jìn)程準(zhǔn)備好了再逐個按順序執(zhí)行。

但其實(shí)go語言并沒有完全實(shí)現(xiàn)了CSP模型的所有理論,僅僅是借用了 process和channel這兩個概念。process是在go語言上的表現(xiàn)就是 goroutine 是實(shí)際并發(fā)執(zhí)行的實(shí)體,每個實(shí)體之間是通過channel通訊來實(shí)現(xiàn)數(shù)據(jù)共享。

1)goroutine

Goroutine 是go實(shí)際并發(fā)執(zhí)行的實(shí)體,它底層是使用協(xié)程(coroutine)實(shí)現(xiàn)并發(fā),coroutine是一種運(yùn)行在用戶態(tài)的用戶線程,go底層選擇使用coroutine的出發(fā)點(diǎn)是因?yàn)?,它具有以下特點(diǎn):

  1. 用戶空間 避免了內(nèi)核態(tài)和用戶態(tài)的切換導(dǎo)致的成本

  2. 可以由語言和框架層進(jìn)行調(diào)度

  3. 更小的??臻g允許創(chuàng)建大量的實(shí)例

2)channel

go中使用了 CSP中的 channel 。channel 是被單獨(dú)創(chuàng)建并且可以在進(jìn)程之間傳遞,它的通信模式類似于 boss-worker 模式的,一個實(shí)體通過將消息發(fā)送到channel 中,然后又監(jiān)聽這個 channel 的實(shí)體處理,兩個實(shí)體之間是匿名的,這個就實(shí)現(xiàn)實(shí)體中間的解耦,其中 channel 是同步的一個消息被發(fā)送到 channel 中,最終是一定要被另外的實(shí)體消費(fèi)掉的,在實(shí)現(xiàn)原理上其實(shí)是一個阻塞的消息隊(duì)列。

3)調(diào)度器

goroutine是在golang層面提供了調(diào)度器,在調(diào)度器加入了steal working 算法 ,goroutine是可以被異步搶占,因此沒有函數(shù)調(diào)用的循環(huán)不再對調(diào)度器造成死鎖或造成垃圾回收的大幅變慢。并且go對網(wǎng)絡(luò)IO庫進(jìn)行了封裝,屏蔽了復(fù)雜的細(xì)節(jié),對外提供統(tǒng)一的語法關(guān)鍵字支持,簡化了并發(fā)程序編寫的成本。

“go語言為什么支持高并發(fā)”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI