亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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

CSP并發(fā)模型

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

Golang CSP

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

Channel

Golang中使用 CSP中 channel 這個概念。channel 是被單獨創(chuàng)建并且可以在進程之間傳遞,它的通信模式類似于 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ā)點是因為,它具有以下特點:

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

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

Goroutine 調度器

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

N:1 多個用戶線程對應一個內核線程

1:1 一個用戶線程對應一個內核線程

M:N 用戶線程和內核線程是多對多的對應關系

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

調度示意

圖中

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

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

總結

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

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

相關文章

  • Go語言學習之WaitGroup用法詳解

    Go語言學習之WaitGroup用法詳解

    Go語言中的?WaitGroup?和?Java?中的?CyclicBarrier、CountDownLatch?非常類似。本文將詳細為大家講講WaitGroup的用法,感興趣的小伙伴可以跟隨小編一起學習一下
    2022-06-06
  • Go語言 channel如何實現(xiàn)歸并排序中的merge函數(shù)詳解

    Go語言 channel如何實現(xiàn)歸并排序中的merge函數(shù)詳解

    這篇文章主要給大家介紹了關于Go語言 channel如何實現(xiàn)歸并排序中merge函數(shù)的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2018-02-02
  • Go語言colly框架的快速入門

    Go語言colly框架的快速入門

    Python?中非常知名的爬蟲框架有Scrapy,Go?中也有一些?star?數(shù)較高的爬蟲框架,colly就是其中的佼佼者,它?API?簡潔,性能優(yōu)良,開箱即用,今天就來快速學習一下吧
    2023-07-07
  • 使用go連接clickhouse方式

    使用go連接clickhouse方式

    這篇文章主要介紹了使用go連接clickhouse方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • go實現(xiàn)一個分布式限流器的方法步驟

    go實現(xiàn)一個分布式限流器的方法步驟

    項目中需要對api的接口進行限流,本文主要介紹了go實現(xiàn)一個分布式限流器的方法步驟,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Go中的gRPC入門教程詳解

    Go中的gRPC入門教程詳解

    本文詳細講解了Go中的gRPC入門教程,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-03-03
  • Golang Type關鍵字的使用

    Golang Type關鍵字的使用

    Type關鍵字在Go語言中作用很重要,比如定義結構體,接口,還可以自定義類型,定義類型別名等,具有一定的參考價值,感興趣的可以了解一下
    2023-11-11
  • golang解析域名的步驟全紀錄

    golang解析域名的步驟全紀錄

    這篇文章主要給大家介紹了利用golang如何解析域名的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學習學習吧
    2018-12-12
  • golang常用手冊之切片(Slice)原理

    golang常用手冊之切片(Slice)原理

    本篇文章主要介紹了golang常用手冊之切片(Slice)原理,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12
  • 一篇文章學會GO語言中的變量

    一篇文章學會GO語言中的變量

    Go語言是靜態(tài)類型語言,因此變量有明確類型的,編譯器也會檢查變量類型的正確性,下面這篇文章主要給大家介紹了關于GO語言中變量的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-07-07

最新評論