本文讲解的是golang.org/x/sync这个包中的errgroup1、errgroup 的基础介绍
这里假设 url1 执行1秒,url2 执行报错,url3执行3秒。所以当url2报错后,就不用等url3执行结束就可以返回了。[code]package mainimport ( "context" "errors" "fmt" "golang.org/x/sync/errgroup" "strings" "time")func main() { queryUrls := map[string]string{ "url1": "http://localhost/url1", "url2": "http://localhost/url2", "url3": "http://localhost/url3", } var results []string ctx, cancel := context.WithCancel(context.Background()) eg, errCtx := errgroup.WithContext(ctx) for _, url := range queryUrls { url := url eg.Go(func() error { result, err := query(errCtx, url) if err != nil { //其实这里不用手动取消,看完源码就知道为啥了 cancel() return err } results = append(results, fmt.Sprintf("url:%s -- ret: %v", url, result)) return nil }) } err := eg.Wait() if err != nil { fmt.Println("eg.Wait error:", err) return } for k, v := range results { fmt.Printf("%v ---> %v\n", k, v) }}func query(errCtx context.Context, url string) (ret string, err error) { fmt.Printf("请求 %s 开始....\n", url) // 假设这里是发送请求,获取数据 if strings.Contains(url, "url2") { // 假设请求 url2 时出现错误 time.Sleep(time.Second*2) return "", errors.New("请求出错") } else if strings.Contains(url, "url3") { // 假设 请求 url3 需要1秒 select { case
欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) | Powered by Discuz! X3.4 |