最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Golang CSP并發(fā)機(jī)制及使用模型

 更新時間:2022年05月25日 16:16:32   作者:falm  
這篇文章主要為大家介紹了Golang CSP并發(fā)機(jī)制及使用模型,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

今天介紹一下 go語言的并發(fā)機(jī)制以及它所使用的CSP并發(fā)模型

CSP并發(fā)模型

CSP模型是上個世紀(jì)七十年代提出的,用于描述兩個獨立的并發(fā)實體通過共享的通訊 channel(管道)進(jìn)行通信的并發(fā)模型。 CSP中channel是第一類對象,它不關(guān)注發(fā)送消息的實體,而關(guān)注與發(fā)送消息時使用的channel。

Golang CSP

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

Channel

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

Goroutine

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

  • 用戶空間 避免了內(nèi)核態(tài)和用戶態(tài)的切換導(dǎo)致的成本
  • 可以由語言和框架層進(jìn)行調(diào)度
  • 更小的??臻g允許創(chuàng)建大量的實例

可以看到第二條 用戶空間線程的調(diào)度不是由操作系統(tǒng)來完成的,像在java 1.3中使用的greenthread的是由JVM統(tǒng)一調(diào)度的(后java已經(jīng)改為內(nèi)核線程),還有在ruby中的fiber(半?yún)f(xié)程) 是需要在重新中自己進(jìn)行調(diào)度的,而goroutine是在golang層面提供了調(diào)度器,并且對網(wǎng)絡(luò)IO庫進(jìn)行了封裝,屏蔽了復(fù)雜的細(xì)節(jié),對外提供統(tǒng)一的語法關(guān)鍵字支持,簡化了并發(fā)程序編寫的成本。

Goroutine 調(diào)度器

上節(jié)已經(jīng)說了,golang使用goroutine做為最小的執(zhí)行單位,但是這個執(zhí)行單位還是在用戶空間,實際上最后被處理器執(zhí)行的還是內(nèi)核中的線程,用戶線程和內(nèi)核線程的調(diào)度方法有:

N:1 多個用戶線程對應(yīng)一個內(nèi)核線程

1:1 一個用戶線程對應(yīng)一個內(nèi)核線程

M:N 用戶線程和內(nèi)核線程是多對多的對應(yīng)關(guān)系

golang 通過為goroutine提供語言層面的調(diào)度器,來實現(xiàn)了高效率的M:N線程對應(yīng)關(guān)系

調(diào)度示意

圖中

  • M:是內(nèi)核線程
  • P : 是調(diào)度協(xié)調(diào),用于協(xié)調(diào)M和G的執(zhí)行,內(nèi)核線程只有拿到了 P才能對goroutine繼續(xù)調(diào)度執(zhí)行,一般都是通過限定P的個數(shù)來控制golang的并發(fā)度
  • G : 是待執(zhí)行的goroutine,包含這個goroutine的??臻g
  • Gn : 灰色背景的Gn 是已經(jīng)掛起的goroutine,它們被添加到了執(zhí)行隊列中,然后需要等待網(wǎng)絡(luò)IO的goroutine,當(dāng)P通過 epoll查詢到特定的fd的時候,會重新調(diào)度起對應(yīng)的,正在掛起的goroutine。

Golang為了調(diào)度的公平性,在調(diào)度器加入了steal working 算法 ,在一個P自己的執(zhí)行隊列,處理完之后,它會先到全局的執(zhí)行隊列中偷G進(jìn)行處理,如果沒有的話,再會到其他P的執(zhí)行隊列中搶G來進(jìn)行處理。

總結(jié)

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

以上就是Golang CSP并發(fā)機(jī)制及使用模型的詳細(xì)內(nèi)容,更多關(guān)于Golang CSP并發(fā)模型的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • go并發(fā)利器sync.Once使用示例詳解

    go并發(fā)利器sync.Once使用示例詳解

    這篇文章主要為大家介紹了go并發(fā)利器sync.Once使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • golang占位符%v、%+v、%#v舉例詳解

    golang占位符%v、%+v、%#v舉例詳解

    這篇文章主要給大家介紹了關(guān)于golang占位符%v、%+v、%#v的相關(guān)資料,Go語言中的占位符通常用于格式化輸出,它們以%開頭,后跟一個字符,表示要轉(zhuǎn)換的數(shù)據(jù)類型,需要的朋友可以參考下
    2024-05-05
  • Go語言基礎(chǔ)語法之結(jié)構(gòu)體及方法詳解

    Go語言基礎(chǔ)語法之結(jié)構(gòu)體及方法詳解

    結(jié)構(gòu)體類型可以用來保存不同類型的數(shù)據(jù),也可以通過方法的形式來聲明它的行為。本文將介紹go語言中的結(jié)構(gòu)體和方法,以及“繼承”的實現(xiàn)方法
    2021-09-09
  • Golang 發(fā)送http請求時設(shè)置header的實現(xiàn)

    Golang 發(fā)送http請求時設(shè)置header的實現(xiàn)

    這篇文章主要介紹了Golang 發(fā)送http請求時設(shè)置header的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • Golang導(dǎo)入包的幾種方式(點,別名與下劃線)

    Golang導(dǎo)入包的幾種方式(點,別名與下劃線)

    這篇文章主要介紹了Golang導(dǎo)入包的幾種方式(點,別名與下劃線),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 詳解Golang如何優(yōu)雅接入多個遠(yuǎn)程配置中心

    詳解Golang如何優(yōu)雅接入多個遠(yuǎn)程配置中心

    這篇文章主要為大家為大家介紹了Golang如何優(yōu)雅接入多個遠(yuǎn)程配置中心詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • 一文詳細(xì)介紹golang中.()類型斷言的使用方法

    一文詳細(xì)介紹golang中.()類型斷言的使用方法

    Golang是一門非常流行的編程語言,在很多領(lǐng)域都有著廣泛的應(yīng)用,在開發(fā)過程中,很多時候我們需要將函數(shù)作為參數(shù)傳遞給其他函數(shù),這時候就需要用到golang中的.()用法,本文將詳細(xì)介紹golang中.()的使用方法,需要的朋友可以參考下
    2023-08-08
  • 詳解Go語言中如何高效地處理集合

    詳解Go語言中如何高效地處理集合

    在?Go?語言中,雖然沒有像?Java?或?Python?那樣的傳統(tǒng)集合框架,但也可以非常高效地處理集合操作,下面小編就來和大家講講具體處理方法吧
    2025-01-01
  • 詳解為什么說Golang中的字符串類型不能修改

    詳解為什么說Golang中的字符串類型不能修改

    在接觸Go這么語言,可能你經(jīng)常會聽到這樣一句話。對于字符串不能修改,可能你很納悶,日常開發(fā)中我們對字符串進(jìn)行修改也是很正常的,為什么又說Go中的字符串不能進(jìn)行修改呢?本文就來通過實際案例給大家演示一下
    2023-03-03
  • Golang官方限流器time/rate的使用與實現(xiàn)詳解

    Golang官方限流器time/rate的使用與實現(xiàn)詳解

    限流器是后臺服務(wù)中十分重要的組件,在實際的業(yè)務(wù)場景中使用居多。time/rate?包基于令牌桶算法實現(xiàn)限流,本文主要為大家介紹了time/rate的使用與實現(xiàn),需要的可以參考一下
    2023-04-04

最新評論

新营市| 濮阳县| 焉耆| 闻喜县| 时尚| 肇源县| 聂拉木县| 庆元县| 弋阳县| 隆安县| 聊城市| 侯马市| 新乡市| 渭南市| 新安县| 明星| 新田县| 三明市| 武宁县| 乌拉特中旗| 山东省| 利津县| 巴东县| 四平市| 秭归县| 外汇| 九龙城区| 孝感市| 长武县| 修文县| 安丘市| 清水河县| 射洪县| 区。| 洞头县| 石城县| 麻阳| 昌平区| 林口县| 高碑店市| 五峰|