golang errGroup使用

  1. 1. 概述
  2. 2. 例子
  3. 3. 说明

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. 说明

  1. errCtx.Done()group.Wait()会阻塞

  2. cancel函数会触发errCtx.Done(),但协程不会停止

  3. cancel只能cancel一次,第二次没有效果

  4. 全协程退出后,会触发group.Wait()

  5. group.Wait()的返回错误,只会有最近一次错误

  6. cancelerrCtx.Done()只能在group.Go中有效


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 wind.kaisa@gmail.com

💰

×

Help us with donation