成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Golang 語言怎么控制并發 Goroutine?

開發 后端
Golang 語言的優勢之一是天生支持并發,我們在 Golang 語言開發中,通常使用的并發控制方式主要有 Channel,WaitGroup 和 Context,本文我們主要介紹一下 Golang 語言中并發控制的這三種方式怎么使用?

 [[408188]]

01介紹

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

02Channel

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

示例代碼:

  1. func main () { 
  2.  done := make(chan struct{}) 
  3.  go func() { 
  4.   fmt.Println("goroutine run over"
  5.   done <- struct{}{} 
  6.  }() 
  7.  <- done 
  8.  fmt.Println("main goroutine run over"

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

03sync.WaitGroup

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

示例代碼:

  1. func main () { 
  2.  wg := sync.WaitGroup{} 
  3.  wg.Add(10) 
  4.  for i := 0; i < 10; i++ { 
  5.   go func(id int) { 
  6.    fmt.Println(id, "運行結束"
  7.    wg.Done() 
  8.   }(i) 
  9.  } 
  10.  wg.Wait() 
  11.  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 的應用程序的并發控制中,如果在 Golang 應用程序中,子協程繼續派生出協程,我們應該怎么控制呢?這種多級 goroutine 的應用程序,我們可以使用 Context 實現并發控制。

示例代碼:

  1. func main() { 
  2.  ctx, cancel := context.WithCancel(context.Background()) 
  3.  go firstCtx(ctx) 
  4.  time.Sleep(5 * time.Second
  5.  fmt.Println("stop all sub goroutine"
  6.  cancel() 
  7.  time.Sleep(5 * time.Second
  8.  
  9. func firstCtx(ctx context.Context) { 
  10.  go secondCtx(ctx) 
  11.  for { 
  12.   select { 
  13.   case <-ctx.Done(): 
  14.    fmt.Println("first done"
  15.    return 
  16.   default
  17.    fmt.Println("first running"
  18.    time.Sleep(2 * time.Second
  19.   } 
  20.  } 
  21.  
  22. func secondCtx(ctx context.Context) { 
  23.  for { 
  24.   select { 
  25.   case <-ctx.Done(): 
  26.    fmt.Println("second done"
  27.    return 
  28.   default
  29.    fmt.Println("second running"
  30.    time.Sleep(2 * time.Second
  31.   } 
  32.  } 

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

05總結

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

本文轉載自微信公眾號「Golang語言開發棧」,可以通過以下二維碼關注。轉載本文請聯系Golang語言開發棧公眾號。

 

責任編輯:武曉燕 來源: Golang語言開發棧
相關推薦

2021-09-30 09:21:28

Go語言并發編程

2025-01-15 09:13:53

2021-09-13 05:02:49

GogRPC語言

2021-04-28 09:02:48

Golang語言Context

2021-06-09 23:36:46

Golang語言版本

2023-01-30 15:41:10

Channel控制并發

2021-10-10 23:02:49

Golang語言代碼

2021-12-13 01:24:14

語言Golang panic

2022-04-13 08:23:31

Golang并發

2021-11-08 23:09:07

Go排序數據

2021-06-07 23:19:44

Golang語言 Defer

2021-07-22 09:43:09

Golang語言并發機制

2021-10-31 23:01:50

語言拼接字符串

2023-05-22 09:27:11

GMPGolang

2023-08-21 07:34:37

GolangGMP

2017-08-21 10:56:55

MySQL并發控制

2022-08-08 08:31:55

Go 語言閉包匿名函數

2022-08-08 06:50:06

Go語言閉包

2023-11-20 22:44:09

Golang并發

2022-01-04 23:13:57

語言PanicGolang
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 天堂一区二区三区 | 成人亚洲性情网站www在线观看 | 亚洲欧美一区二区三区1000 | 成人一区二区三区视频 | 精品欧美一区二区中文字幕视频 | 久久成人综合 | 欧美a区 | 国产精品jizz在线观看老狼 | 一区二区在线 | 成人综合一区 | 欧美人妇做爰xxxⅹ性高电影 | 欧美精品久久久 | 久久99精品久久久 | 99久久婷婷| 亚洲日产精品 | 欧美成人精品一区二区三区 | 成人午夜电影在线观看 | 日韩欧美国产一区二区 | 国产综合在线视频 | 欧美黄色片 | 日本不卡一区二区 | 91久久北条麻妃一区二区三区 | 亚洲一区二区三区视频 | 国产日韩精品视频 | 国产一级视频在线观看 | 国产乱码久久久久久 | 欧美老少妇一级特黄一片 | 99精品99| 色婷婷久久久亚洲一区二区三区 | 男女爱爱福利视频 | av入口| 久久久久久久久久久久亚洲 | 久久精品亚洲精品 | 美女在线观看av | v片网站| 亚洲欧美激情国产综合久久久 | 亚洲欧美中文日韩在线 | 日本三级网址 | 久久久久久久久久久一区二区 | 国产精品揄拍一区二区 | 看真人视频一级毛片 |