如何在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+ 次浏览

启动你的职业生涯

完成课程获得认证

开始学习
广告