日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Golang語言怎么控制并發(fā)Goroutine?

 [[408188]]

01介紹

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

創(chuàng)新互聯(lián)公司長期為上1000+客戶提供的網(wǎng)站建設服務,團隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務;打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為鎮(zhèn)賚企業(yè)提供專業(yè)的成都網(wǎng)站制作、成都網(wǎng)站設計、外貿(mào)營銷網(wǎng)站建設鎮(zhèn)賚網(wǎng)站改版等技術(shù)服務。擁有十余年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。

02Channel

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

示例代碼:

 
 
 
 
  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 運行結(jié)束后,通過 Channel 通知主 goroutine 退出程序,實際上也可以反過來處理,主 goroutine 通知子 goroutine 退出程序,主 goroutine 向 channel 中發(fā)送數(shù)據(jù),子 goroutine 等待接收 channel 中的數(shù)據(jù)。

03sync.WaitGroup

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

示例代碼:

 
 
 
 
  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, "運行結(jié)束") 
  7.    wg.Done() 
  8.   }(i) 
  9.  } 
  10.  wg.Wait() 
  11.  fmt.Println("main goroutine run over") 

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

04Context

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

示例代碼:

 
 
 
 
  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.  } 

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

05總結(jié)

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

本文轉(zhuǎn)載自微信公眾號「Golang語言開發(fā)?!?,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系Golang語言開發(fā)棧公眾號。


本文標題:Golang語言怎么控制并發(fā)Goroutine?
網(wǎng)頁地址:http://www.dlmjj.cn/article/cogcohe.html