关于ErrorGruop的介绍和使用

介绍:

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


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容