共计 961 个字符,预计需要花费 3 分钟才能阅读完成。
概述
倡议先浏览 goroutine。
在 goroutine 大节中,为了让并发的 3 个 goroutine
失常执行实现,调用 time.Sleep()
睡眠期待。
这样的形式存除了实现不优雅之外,最大的问题在于: time.Sleep()
承受的是一个硬编码的工夫参数,这就要求咱们实现必须晓得每个 goroutine
的执行工夫并且要以执行工夫最长的 goroutine
为基准,这在大多数场景下是没方法做到的。
如果主过程可能晓得每个 goroutine
是何时完结的,并且在完结之后发一个告诉给主过程,那么问题就能够完满解决了。
Go 提供的 sync.WaitGroup
就是针对这种场景的解决方案。
调用规定
Add()
和Done()
办法必须配对,Wait()
办法必须在程序退出前调用。Add()
,Done()
,Wait()
三者必须同属一个作用域。
例子
读者能够多运行几次上面的例子,领会 sync.WaitGroup
的用法和细节。
调用 3 个 goroutine
package main
import (
"fmt"
"sync"
)
func main() {
var wg sync.WaitGroup // 申明一个 sync.WaitGroup 实例
wg.Add(3) // 参数 为 3,正好对应了 3 个 goroutine
// 3 个 goroutine 是并发运行的,所以程序不肯定是 1, 2, 3
// 读者能够多运行几次,看看输入后果
go func() {defer func() {wg.Done() // 告诉主过程,这个 goroutine 曾经执行实现
}()
fmt.Println("goroutine 1")
}()
go func() {defer func() {wg.Done() // 告诉主过程,这个 goroutine 曾经执行实现
}()
fmt.Println("goroutine 2")
}()
go func() {defer func() {wg.Done() // 告诉主过程,这个 goroutine 曾经执行实现
}()
fmt.Println("goroutine 3")
}()
wg.Wait() // 期待所有 goroutine 全副执行完}
// $ go run main.go
// 输入如下,3 个 goroutine 是并发运行的,程序不肯定,所以你的输入可能和这里的不一样
/**
goroutine 3
goroutine 1
goroutine 2
*/
分割我
正文完