如何在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**”。
广告
数据结构
网络
关系数据库管理系统 (RDBMS)
操作系统
Java
iOS
HTML
CSS
Android
Python
C语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP