前言
errgroup 是 Go 语言标准库中的一个实用工具,它能够协调多个 goroutine 的并发执行,并监控它们的执行状态,而且对于创建多个协程比较好
errgroup使用
package main
import (
"context"
"fmt"
"golang.org/x/sync/errgroup"
)
func main() {
g, ctx := errgroup.WithContext(context.Background())
context.WithCancel(ctx)
g.Go(func() error {
fmt.Println(12)
return nil
})
err := g.Wait()
if err != nil {
return
}
fmt.Println(13)
}
WithCancel使用
package main
import (
"context"
"fmt"
"golang.org/x/sync/errgroup"
"time"
)
func hello(ctx context.Context) {
for {
select {
case <-ctx.Done():
fmt.Println("playing")
return
default:
fmt.Println("I am working!")
time.Sleep(time.Second)
}
}
}
func main() {
g, ctx := errgroup.WithContext(context.Background())
ctx1, cancelFunc := context.WithCancel(ctx)
g.Go(func() error {
fmt.Println(121221)
time.Sleep(5 * time.Second)
cancelFunc()
return nil
})
hello(ctx1)
err := g.Wait()
if err != nil {
return
}
}
总结
go中使用errgroup能够很好的帮我们控制异步的等待,而且比起waitGroup来讲,不用去维护计数器之间的关系,不过在具体开发中,看个人习惯以及开发效率,毕竟技术的实现有很多种