Go 语言 中要等待 goroutine 的结束,可以使用 sync.WaitGroup
相关的操作,首先,使用 wg.Add
方法增加需要等到的协程的数量,然后没执行完一个协程,使用 wg.Done
表明协程结束,最后使用 wg.Wait
等到所有的协程结束。
wg sync.WaitGroup
// 设置需要等待的协程数
wg.Add(num)
// 一个协程处理结束
wg.Done()
// 等到所有的协程结束
wg.Wait()
首先,使用 wg.Add
设置我们需要等到的协程的数量,接着,每执行完一个协程之后,使用 wg.Done
表明协程结束,最后使用 wg.Wait
等待所有的协程结束。
使用 sync.WaitGroup 等待协程结束
package main
import (
"fmt"
"sync"
"time"
)
var(
wg sync.WaitGroup
)
func printInfo(s string){
defer wg.Done()
for i := 0; i < 2; i++{
fmt.Println("Info =", s, "i =", i)
// 延时1秒
time.Sleep(time.Second)
}
}
func main() {
fmt.Println("嗨客网(www.haicoder.net)")
wg.Add(1)
// 使用 sync.WaitGroup 等待协程结束
go printInfo("HaiCoder Golang")
wg.Wait()
}
程序运行后,控制台输出如下:
首先,我们定义了一个 sync.WaitGroup
类型的 全局变量 wg
,同时,我们创建了一个 printInfo 函数,该函数接受一个 string 类型的参数,没有任何返回值,在该函数里,我们通过 for 循环执行两次输出语句,每次输出完之后,使用 Sleep 函数实现睡眠一秒钟。
同时,在 printInfo 函数里,我们使用 defer 实现,在该函数执行完毕时,调用 wg.Done()
表明一个协程执行结束。
最后,在 main 函数,我们首先使用 wg.Add
设置我们需要等到的协程数,为 1,接着使用 go 创建一个协程,并使用 wg.Wait
等待协程的结束。
我们看到,程序输出了两次之后,程序退出了,这里,我们使用了 sync.WaitGroup
的相关操作,实现了等待所有的协程退出。
使用 sync.WaitGroup 等待多个协程结束
package main
import (
"fmt"
"sync"
)
var(
wg sync.WaitGroup
)
func sum(num int)int{
defer wg.Done()
result := 0
for i := 1; i <= num; i++{
result += i
}
fmt.Println("Sum =", result)
return result
}
func mul(num int)int{
defer wg.Done()
result := 1
for i := 1; i <= num; i++{
result *= i
}
fmt.Println("Mul =", result)
return result
}
func main() {
fmt.Println("嗨客网(www.haicoder.net)")
wg.Add(2)
// 使用 sync.WaitGroup 等待多个协程结束
go sum(100)
go mul(10)
wg.Wait()
}
程序运行后,控制台输出如下:
首先,我们定义了一个 sync.WaitGroup
类型 的全局变量 wg
,同时,我们创建了一个 sum 函数和一个 mul 函数,sum 函数实现求 1 到 num 的和,mul 函数实现求 1 到 num 的乘积。
同时,在 sum 函数和 mul 函数里,我们都使用 defer 实现在该函数执行完毕时,调用 wg.Done()
表明一个协程执行结束。
最后,在 main 函数,我们首先使用 wg.Add
设置我们需要等到的协程数,为 2,接着使用 go 创建两个协程,并使用 wg.Wait
等待协程的结束。
我们看到,我们的程序等待 sum 函数和 mul 函数都执行完毕之后,程序退出了,这里,我们使用了 sync.WaitGroup
的相关操作,实现了等待所有的协程退出。
Go 语言中要等待 goroutine 的结束,可以使用 sync.WaitGroup
相关的操作,首先,使用 wg.Add
方法增加需要等到的协程的数量,然后没执行完一个协程,使用 wg.Done
表明协程结束,最后使用 wg.Wait
等到所有的协程结束。