介绍:
作用与sync.WaitGroup类似;相比sync.WaitGroup会对子任务出现错误的情况进行处理,处理方式:通过context传递错误,通知其他同级子任务。
使用:
package main
import (
"context"
"crypto/rand"
"errors"
"fmt"
"golang.org/x/sync/errgroup"
"math/big"
)
const (
gn = 1000
)
func main() {
eg, cxt := errgroup.WithContext(context.Background())
// sub tasks
for i := 0; i < gn; i++ {
index := i
eg.Go(func() error {
// mock error
r := random(gn)
if index != 0 && r != 0 && int64(index)%r == 0 {
fmt.Println("index is", index, " r is", r, " error happen")
return errors.New("mock err")
}
// receive the error message
select {
case <-cxt.Done(): // error
fmt.Println(index, " canceled")
return nil
default: // no error
fmt.Println(index, " exec")
}
return nil
})
}
err := eg.Wait()
if err != nil {
panic(err)
}
}
// random
func random(max int64) int64 {
var i *big.Int
i, err := rand.Int(rand.Reader, new(big.Int).SetInt64(max))
if err != nil {
panic(err)
}
return i.Int64()
}
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。