go的err.Group()

https://github.com/go-kratos/kratos/blob/v1.0.x/pkg/sync/errgroup/doc.go

1目录

  1. sync.errgroup的由来
  2. sync.errgroup 的示例
  3. sync.errgroup 源码阅读
  4. sync.errgroup延展kratos/pkg/sync/errgroup
  5. sync.errgroup开源项目使用情况
    6.Q&A

WaitGroup处理并发任务
创建goroutine ,开始任务调用wg.Add(1);
任务结束,调用wg.Done();
等待所有任务完成,调用wg.Wait()

sync.errgroup的由来:
errgroup是为了处理一组任务的子任务的goroutine 组,它提供同步、错误传递和上下文取消。

你有一组任务是并发的工作,当遇到某种错误或者你不想再输出了,你可能想取消整个goroutine,那么errgroup.errgroup就是为你而设计的。、

点击查看代码
package main

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

func hello(i int) {
	fmt.Println( "hello",i)
}
func main(){
	var g errgroup.Group
	var urls = []string{
		"http://www.baidu.com/",
		"http://www.baidu.com/",
		"http://www.1234567.com", //假的
	}
	for _, url := range urls {
		// Launch a goroutine to fetch the URL.
		url := url
		g.Go(func() error {
			//Fetch the URL.
				resp, err := http.Get(url)
				if err == nil {//这里记得关掉
					resp.Body.Close()
			}
			// ..这里可以做一些resp 的处理
			return err
		})
	}
	// Wait for all HTTP fetches to complete.
	err := g.Wait();
	if err != nil {
		fmt.Printf("err: %v", err)
		return
	}
	fmt.Println("Successfully fetched all URLs.")

}
posted @ 2022-02-28 14:35  ty1539  阅读(147)  评论(0编辑  收藏  举报