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

Golang 語言控制并發(fā) Goroutine的方法

 更新時間:2021年06月30日 10:31:14   作者:frank  
本文我們介紹了不同場景中分別適合哪種控制并發(fā) goroutine 的方式,其中,channel 適合控制少量 并發(fā) goroutine,WaitGroup 適合控制一組并發(fā) goroutine,而 context 適合控制多級并發(fā) goroutine,感興趣的朋友跟隨小編一起看看吧

goroutine 是 Go語言中的輕量級線程實現,由 Go 運行時(runtime)管理。Go 程序會智能地將 goroutine 中的任務合理地分配給每個 CPU。

01介紹

Golang 語言的優(yōu)勢之一是天生支持并發(fā),我們在 Golang 語言開發(fā)中,通常使用的并發(fā)控制方式主要有 Channel,WaitGroup 和 Context,本文我們主要介紹一下 Golang 語言中并發(fā)控制的這三種方式怎么使用?關于它們各自的詳細介紹在之前的文章已經介紹過,感興趣的讀者朋友們可以按需翻閱。

02Channel

在 Golang 語言中,Channel 不僅可以用于協(xié)程之間通信,還可以使用 Channel 控制子協(xié)程,而且使用 Channel 實現并發(fā)控制比較簡單,比如以下示例,我們在 Golang 應用程序中啟動兩個協(xié)程,分別是主協(xié)程和子協(xié)程,主協(xié)程需要等待子協(xié)程運行結束后再退出程序。

示例代碼:

func main () { 
 done := make(chan struct{}) 
 go func() { 
  fmt.Println("goroutine run over") 
  done <- struct{}{} 
 }() 
 <- done 
 fmt.Println("main goroutine run over") 
} 

閱讀上面這段代碼,我們在子 goroutine 運行結束后,通過 Channel 通知主 goroutine 退出程序,實際上也可以反過來處理,主 goroutine 通知子 goroutine 退出程序,主 goroutine 向 channel 中發(fā)送數據,子 goroutine 等待接收 channel 中的數據。

03sync.WaitGroup

如果在 Golang 應用程序中,需要讓主 goroutine 等待多個 goroutine 都運行結束后再退出程序,我們應該怎么實現呢?是的,同樣可以使用 Channel 實現,但是,有一個更優(yōu)雅的實現方式,那就是 WaitGroup,顧名思義,WaitGroup 就是等待一組 goroutine 運行結束。

示例代碼:

func main () { 
 wg := sync.WaitGroup{} 
 wg.Add(10) 
 for i := 0; i < 10; i++ { 
  go func(id int) { 
   fmt.Println(id, "運行結束") 
   wg.Done() 
  }(i) 
 } 
 wg.Wait() 
 fmt.Println("main goroutine run over") 
} 

閱讀上面這段代碼,我們啟動 10 個子 goroutine,主 goroutine 需要等待 10 個子 goroutine 都運行結束后再退出程序,我們使用的是 WaitGroup,它有三個方法,分別是 Add、Done 和 Wait,實際上 WaitGroup 維護了一個計數器,這三個方法都是圍繞這個計數器工作,Add 用于設置計數器的數值,Done 用于扣減計數器的數值,Wait 在計數器數值為 0 之前一直阻塞。關于 WaitGroup 的源碼解讀,在之前的文章中已介紹過,限于篇幅,這里就不再贅述。

04Context

Channel 和 WaitGroup 通常用于父子兩個層級的 goroutine 的應用程序的并發(fā)控制中,如果在 Golang 應用程序中,子協(xié)程繼續(xù)派生出協(xié)程,我們應該怎么控制呢?這種多級 goroutine 的應用程序,我們可以使用 Context 實現并發(fā)控制。

示例代碼:

func main() { 
 ctx, cancel := context.WithCancel(context.Background()) 
 go firstCtx(ctx) 
 time.Sleep(5 * time.Second) 
 fmt.Println("stop all sub goroutine") 
 cancel() 
 time.Sleep(5 * time.Second) 
} 
 
func firstCtx(ctx context.Context) { 
 go secondCtx(ctx) 
 for { 
  select { 
  case <-ctx.Done(): 
   fmt.Println("first done") 
   return 
  default: 
   fmt.Println("first running") 
   time.Sleep(2 * time.Second) 
  } 
 } 
} 
 
func secondCtx(ctx context.Context) { 
 for { 
  select { 
  case <-ctx.Done(): 
   fmt.Println("second done") 
   return 
  default: 
   fmt.Println("second running") 
   time.Sleep(2 * time.Second) 
  } 
 } 
} 

閱讀上面這段代碼,在子協(xié)程 firstCtx 啟動子協(xié)程 secondCtx,主 goroutine 創(chuàng)建 context,并把 context 傳遞到所有子協(xié)程,然后主 goroutine 通過調用 cancle 停掉所有子協(xié)程。

05總結

本文我們介紹了不同場景中分別適合哪種控制并發(fā) goroutine 的方式,其中,channel 適合控制少量 并發(fā) goroutine,WaitGroup 適合控制一組并發(fā) goroutine,而 context 適合控制多級并發(fā) goroutine。

到此這篇關于Golang 語言控制并發(fā) Goroutine的方法的文章就介紹到這了,更多相關Golang并發(fā)控制Goroutine內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 詳解Golang互斥鎖內部實現

    詳解Golang互斥鎖內部實現

    本篇文章主要介紹了詳解Golang互斥鎖內部實現,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • Go調用opencv實現圖片矯正的代碼示例

    Go調用opencv實現圖片矯正的代碼示例

    這篇文章主要為大家詳細介紹了Go調用opencv實現圖片矯正的代碼示例,文中的示例代碼簡潔易懂,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-09-09
  • 盤點幾種Go語言開發(fā)的IDE

    盤點幾種Go語言開發(fā)的IDE

    Go語言作為一種新興的編程語言,近年來受到了越來越多的關注,它以其簡潔、高效和并發(fā)性能而聞名,被廣泛應用于各種軟件開發(fā)項目中,本文將介紹幾種常用的Go語言IDE,并對它們進行比較,幫助開發(fā)者根據自己的需求選擇合適的工具,需要的朋友可以參考下
    2023-11-11
  • golang頻率限制 rate詳解

    golang頻率限制 rate詳解

    這篇文章主要介紹了golang頻率限制 rate詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • 簡單聊聊Go語言里面的閉包

    簡單聊聊Go語言里面的閉包

    這篇文章主要為大家詳細介紹了Go語言中閉包的原理與實現的相關資料,文中的示例代碼講解詳細,對我們學習Go語言有一定幫助,需要的可以參考一下
    2022-11-11
  • Golang函數式編程深入分析實例

    Golang函數式編程深入分析實例

    習慣與函數式編程語言的開發(fā)者,會認為for循環(huán)和if判斷語句是冗長的代碼,通過使用map和filter處理集合元素讓代碼更可讀。本文介紹Go閉包實現集合轉換和過濾功能
    2023-01-01
  • Go方法簡單性和高效性的充分體現詳解

    Go方法簡單性和高效性的充分體現詳解

    本文深入探討了Go語言中方法的各個方面,包括基礎概念、定義與聲明、特性、實戰(zhàn)應用以及性能考量,文章充滿技術深度,通過實例和代碼演示,力圖幫助讀者全面理解Go方法的設計哲學和最佳實踐
    2023-10-10
  • 詳解golang中發(fā)送http請求的幾種常見情況

    詳解golang中發(fā)送http請求的幾種常見情況

    這篇文章主要介紹了詳解golang中發(fā)送http請求的幾種常見情況,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-12-12
  • Go語言學習之結構體和方法使用詳解

    Go語言學習之結構體和方法使用詳解

    這篇文章主要為大家詳細介紹了Go語言中結構體和方法的使用,文中的示例代碼講解詳細,對我們學習Go語言有一定的幫助,需要的可以參考一下
    2022-04-04
  • Go進行接口組合的解決方案

    Go進行接口組合的解決方案

    在 Go 語言中,接口組合是一種強大的特性,它允許將多個接口組合成一個新的接口,從而提供更靈活和可擴展的代碼設計,本文給大家介紹了Go如何進行接口組合,需要的朋友可以參考下
    2024-06-06

最新評論

化德县| 迭部县| 石棉县| 来凤县| 平潭县| 临西县| 东辽县| 合阳县| 上思县| 汤原县| 浪卡子县| 镇沅| 邯郸县| 阿拉善右旗| 龙里县| 当阳市| 会昌县| 泊头市| 晋城| 临湘市| 三门县| 上思县| 塘沽区| 公主岭市| 石棉县| 白水县| 洛扎县| 秦皇岛市| 吉林省| 宁夏| 大悟县| 兰溪市| 婺源县| 休宁县| 明星| 襄城县| 彩票| 石狮市| 乐都县| 江口县| 资溪县|