Go语言等待协程结束

Go语言等待协程结束教程

Go 语言 中要等待 goroutine 的结束,可以使用 sync.WaitGroup 相关的操作,首先,使用 wg.Add 方法增加需要等到的协程的数量,然后没执行完一个协程,使用 wg.Done 表明协程结束,最后使用 wg.Wait 等到所有的协程结束。

Go语言等待协程结束

语法

wg sync.WaitGroup // 设置需要等待的协程数 wg.Add(num) // 一个协程处理结束 wg.Done() // 等到所有的协程结束 wg.Wait()

说明

首先,使用 wg.Add 设置我们需要等到的协程的数量,接着,每执行完一个协程之后,使用 wg.Done 表明协程结束,最后使用 wg.Wait 等待所有的协程结束。

案例

等待goroutine结束

使用 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() }

程序运行后,控制台输出如下:

10_goroutine等待结束.png

首先,我们定义了一个 sync.WaitGroup 类型的 全局变量 wg,同时,我们创建了一个 printInfo 函数,该函数接受一个 string 类型的参数,没有任何返回值,在该函数里,我们通过 for 循环执行两次输出语句,每次输出完之后,使用 Sleep 函数实现睡眠一秒钟。

同时,在 printInfo 函数里,我们使用 defer 实现,在该函数执行完毕时,调用 wg.Done() 表明一个协程执行结束。

最后,在 main 函数,我们首先使用 wg.Add 设置我们需要等到的协程数,为 1,接着使用 go 创建一个协程,并使用 wg.Wait 等待协程的结束。

我们看到,程序输出了两次之后,程序退出了,这里,我们使用了 sync.WaitGroup 的相关操作,实现了等待所有的协程退出。

等待多个goroutine结束

使用 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() }

程序运行后,控制台输出如下:

11_goroutine等待结束.png

首先,我们定义了一个 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语言等待协程结束教程总结

Go 语言中要等待 goroutine 的结束,可以使用 sync.WaitGroup 相关的操作,首先,使用 wg.Add 方法增加需要等到的协程的数量,然后没执行完一个协程,使用 wg.Done 表明协程结束,最后使用 wg.Wait 等到所有的协程结束。