如何在Golang中等待goroutine完成?


我們知道,**goroutine** 初學時可能有點棘手,我們經常會遇到主**goroutine** 退出而內部 goroutine 沒有機會執行的情況。

為了能夠執行**goroutine** 直到完成,我們可以使用充當阻塞器的通道,或者使用Go的**sync**包提供的**WaitGroup**。

讓我們首先探討一個只有一個**goroutine**需要完成然後執行其他工作的案例。

示例1

考慮以下程式碼。

package main
import (
   "fmt"
)
func check(ch chan bool){
   fmt.Println("Inside check")
   ch <- true
}
func main() {
   ch := make(chan bool)
   go func(){
      check(ch)
   }()
   <-ch
   fmt.Println("Done")
}

在上面的程式碼中,`<-ch`這一行是最重要的,如果我們將其刪除,則**匿名goroutine**將無法正常執行。

輸出

執行程式碼時,它將在終端中生成以下輸出。

Inside check
Done

在上面的程式碼中,我們看到只有一個**goroutine**的案例,但讓我們考慮一個有多個**goroutine**並且我們想要等待所有goroutine完成的案例。

示例2

考慮以下程式碼。

package main
import (
   "fmt"
   "sync"
)
func check(count int, wg *sync.WaitGroup) {
   defer wg.Done()
   fmt.Println("Inside check", count)
}
func main() {
   count := 3
   var wg sync.WaitGroup
   wg.Add(count)
   for i := 1; i <= count; i++ {
      go check(i, &wg)
   }
   wg.Wait()
   fmt.Println("Done")
}

在上面的程式碼中,我們在for迴圈內啟動了多個**goroutine**,並將**WaitGroup**作為引數傳遞給**check**函式。允許我們等待這些**goroutine**完成的最重要部分是**Wait()**函式。

輸出

執行程式碼時,它將在終端中生成以下輸出。

Inside check 3
Inside check 2
Inside check 1
Done

需要注意的是,上面goroutine中**count**的順序可能會有所不同,但可以肯定的是,只有在所有**goroutine**都執行完畢後,才會列印“**Done**”。

更新於:2022年2月22日

7000+ 次瀏覽

啟動你的職業生涯

完成課程獲得認證

開始學習
廣告