errgroup.Group

在一组 Goroutine 中提供了同步、错误传播以及上下文取消的功能,我们可以使用如下所示的方式并行获取网页的数据:

package main

import (
	"fmt"
	"net/http"

	"golang.org/x/sync/errgroup"
)

func main() {
	var g errgroup.Group
	var urls = []string{
		"http://www.baidu.com/",
		"https://draveness.me/golang/docs/part3-runtime/ch06-concurrency/golang-sync-primitives/",
	}
	for i := range urls {
		url := urls[i]
		g.Go(func() error {
			resp, err := http.Get(url)
			if err == nil {
				resp.Body.Close()
			}
			return err
		})
	}
	if err := g.Wait(); err == nil {
		fmt.Println("Successfully fetched all URLs.")
	}
}

golang/sync/errgroup.Group.Go 方法能够创建一个 Goroutine 并在其中执行传入的函数,而 golang/sync/errgroup.Group.Wait 会等待所有 Goroutine 全部返回,该方法的不同返回结果也有不同的含义:

如果返回错误 — 这一组 Goroutine 最少返回一个错误;
如果返回空值 — 所有 Goroutine 都成功执行;

结构体

type Group struct {
	cancel func()

	wg sync.WaitGroup

	errOnce sync.Once
	err     error
}

1.cancel — 创建 context.Context 时返回的取消函数,用于在多个 Goroutine 之间同步取消信号;
2.wg — 用于等待一组 Goroutine 完成子任务的同步原语;
3.errOnce — 用于保证只接收一个子任务返回的错误

posted @ 2022-03-16 14:47  wangzhilei  阅读(234)  评论(0编辑  收藏  举报