golang errGroup使用 - Wed, Oct 16, 2019
golang errGroup使用与理解
1. 概述
errGroup
能够检测协程的是否报错,一般用于多协程时。
2. 例子
package main
import (
"context"
"fmt"
"time"
"golang.org/x/sync/errgroup"
)
func main() {
ctx, cancel := context.WithCancel(context.Background())
group, errCtx := errgroup.WithContext(ctx)
group.Go(func() error {
go func() {
select {
case <-errCtx.Done():
fmt.Println("errCtx1 Done")
fmt.Println(errCtx.Err())
}
}()
time.Sleep(3 * time.Second)
cancel()
time.Sleep(5 * time.Second)
return nil
})
err := group.Wait()
if err != nil {
fmt.Println(err)
} else {
fmt.Println("All Done")
}
}
3. 说明
errCtx.Done()
和group.Wait()
会阻塞cancel
函数会触发errCtx.Done()
,但协程不会停止cancel
只能cancel
一次,第二次没有效果全协程退出后,会触发
group.Wait()
group.Wait()
的返回错误,只会有最近一次错误cancel
和errCtx.Done()
只能在group.Go
中有效