kaisawind's blog
  • 关于
  • 所有帖子

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

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

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

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

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

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

  6. cancel和errCtx.Done()只能在group.Go中有效


辽ICP备2021007608号 | © 2025 | kaisawind

Facebook Twitter GitHub

▄