Golang 如何等待一个goroutine完成

Golang 如何等待一个goroutine完成

我们知道, goroutines 一开始可能有点棘手,我们经常发现这样的情况:主 goroutines 会退出而不给内部goroutines执行的机会。

为了能够让 goroutines 运行到结束,我们可以利用一个通道作为阻断器,或者使用Go的 同步 包为我们提供的 waitGroups

让我们先来探讨一个案例,我们有一个单独的 goroutines ,我们想完成它,然后做一些其他工作。

例子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循环内跨越了多个 goroutines ,并将 waitGroup 作为参数传递给 检查 函数。允许我们等待这些 goroutines 完成的最重要部分是 Wait() 函数。

输出

当我们运行该代码时,它将在终端产生以下输出。

Inside check 3
Inside check 2
Inside check 1
Done

应该注意的是,上述goroutine中的 计数 顺序可能有所不同,但可以肯定的是,只有当所有的 goroutine 都被执行后,你才会得到打印的 ” Done “。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程