go中的errgroup

273 阅读1分钟

前言

errgroup 是 Go 语言标准库中的一个实用工具,它能够协调多个 goroutine 的并发执行,并监控它们的执行状态,而且对于创建多个协程比较好

errgroup使用

package main

import (
	"context"
	"fmt"
	"golang.org/x/sync/errgroup"
)

func main() {

	g, ctx := errgroup.WithContext(context.Background())
	context.WithCancel(ctx)
	g.Go(func() error {
		fmt.Println(12)
		return nil
	})
	err := g.Wait()
	if err != nil {
		return
	}
	fmt.Println(13)

}

WithCancel使用


package main

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

func hello(ctx context.Context) {
	for {
		select {
		case <-ctx.Done():
			fmt.Println("playing")
			return
		default:
			fmt.Println("I am working!")
			time.Sleep(time.Second)
		}
	}
}

func main() {
	g, ctx := errgroup.WithContext(context.Background())
	ctx1, cancelFunc := context.WithCancel(ctx)
	g.Go(func() error {
		fmt.Println(121221)
		time.Sleep(5 * time.Second)
		cancelFunc()
		return nil
	})
	hello(ctx1)
	err := g.Wait()
	if err != nil {
		return
	}
}


总结

go中使用errgroup能够很好的帮我们控制异步的等待,而且比起waitGroup来讲,不用去维护计数器之间的关系,不过在具体开发中,看个人习惯以及开发效率,毕竟技术的实现有很多种