如何在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**”。
广告