golang errgroup

  • Post author:
  • Post category:golang


例子,如果有一个错误,等待所有goroutine返回,返回第一个错误。

package main

import (
	"context"
	"errors"
	"golang.org/x/sync/errgroup"
	"log"
	"time"
)

func main() {

	ctx, cancel := context.WithTimeout(context.Background(), time.Duration(time.Millisecond*180))
	defer cancel()
	g, gtx := errgroup.WithContext(ctx)

	g.Go(func() error {
		time.Sleep(time.Second * 3)
		select {
		case <-gtx.Done():
			{
				log.Println("++++++++++++++++++")
			}
			return gtx.Err()
		default:
			log.Println("1111111111111111111111")

		}
		return nil
	})

	g.Go(func() error {
		time.Sleep(time.Duration(time.Millisecond * 30))
		select {
		case <-gtx.Done():
			{
				log.Println("---------------")
				return gtx.Err()
			}
		default:
			{
				log.Println("==================")
				return errors.New("this is a test")
			}

		}

	})

	if err := g.Wait(); err != nil {
		log.Println(err.Error())
	} else {
		log.Println("finish")
	}
}

运行返回结果:

2022/10/28 21:11:02 ==================
2022/10/28 21:11:05 ++++++++++++++++++
2022/10/28 21:11:05 this is a test

Process finished with the exit code 0
gtx超时并没有导致其他goroutine结束运行,也没有因为第一个错误整体结束,需要自己增加逻辑来结束。如果需要自己添加逻辑的话,那感觉errgroup就没多大必要了。



版权声明:本文为guoguangwu原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。