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 “。