在一组 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 — 用于保证只接收一个子任务返回的错误

errgroup.Group的更多相关文章

  1. go中errgroup源码解读

    errgroup 前言 如何使用 实现原理 WithContext Go Wait 错误的使用 总结 errgroup 前言 来看下errgroup的实现 如何使用 func main() { var ...

  2. 八. Go并发编程--errGroup

    一. 前言 了解 sync.WaitGroup的用法都知道 一个 goroutine 需要等待多个 goroutine 完成和多个 goroutine 等待一个 goroutine 干活时都可以解决问 ...

  3. golang中的errgroup

    0.1.索引 https://waterflow.link/articles/1665239900004 1.串行执行 假如我们需要查询一个课件列表,其中有课件的信息,还有课件创建者的信息,和课件的缩 ...

  4. drone的pipeline原理与代码分析

    最近的一个项目,需要实现一个工作任务流(task pipeline),基于之前CICD的经验,jenkins pipeline和drone的pipeline进入候选. drone是基于go的cicd解 ...

  5. Gin框架中文文档

    Gin 是一个 go 写的 web 框架,具有高性能的优点.官方地址:https://github.com/gin-gonic/gin 带目录请移步 http://xf.shuangdeyu.com/ ...

  6. Go之Gin

    文章引用自 Gin框架介绍及使用 Gin是一个用Go语言编写的web框架.它是一个类似于martini但拥有更好性能的API框架, 由于使用了httprouter,速度提高了近40倍. 如果你是性能和 ...

  7. GoWeb之gin框架

    Gin 是一个 go 写的 web 框架,具有高性能的优点.官方地址:https://github.com/gin-gonic/gin 一.快速上手 安装 go mod init go get -u ...

  8. gin中运行多个服务

    运行服务的返回类型为 :http.Handler .gin.New(),gin.Default() 返回的就是此类型.使用&http.Server{....} 设置服务参数使用g.Go(fun ...

  9. errgroup 分析

    errgroup 在 WaitGroup 的基础上实现子协程错误传递, 同时使用 context 控制协程的生命周期. 使用 errgroup 的使用非常简单 package main import ...

  10. 十二. Go并发编程--sync/errGroup

    一.序 这一篇算是并发编程的一个补充,起因是当前有个项目,大概の 需求是,根据kafka的分区(partition)数,创建同等数量的 消费者( goroutine)从不同的分区中消费者消费数据,但是 ...

随机推荐

  1. DVWA靶场实战(十二)——XSS(Stored)

    DVWA靶场实战(十二) 五.XSS(Stored): 1.漏洞原理: XSS的Stored被称作存储型XSS漏洞,漏洞的原理为语句被保存到服务器上,显示到HTML页面中,经常出现在用户评论的页面,攻 ...

  2. git拉项目出现的小问题

    问题描述 在IDEA中拉代码事报错. 点击查看报错信息 error: unable to read askpass response from 'C:\Users\霍亚龙\AppData\Local\ ...

  3. Vue28 Web Storage

    https://www.jianshu.com/p/513f6949fc25 1 简介 Web Storage 包括 localStorage 和 sessionStorage ,是浏览器本地数据存储 ...

  4. Vim-Adventures 有趣的Vim小游戏

    入门介绍 Vim-Adventures是一个让初学者练习如何使用 Vim 的小游戏.它一共有 TODO 个 关卡,每个关卡都对应不同的 Vim 练习.一进网页我们可以看到这个画面: 点进去后就自动来到 ...

  5. css当文字过长时,显示省略号

    /* 省略号三属性 */ /* 强制不换行 */ white-space: nowrap; /* 溢出隐藏 */ overflow: hidden; /* 省略号 */ text-overflow: ...

  6. WinUI 剪裁发布中的一个小坑

    WinUI 3 (以下简称 WinUI)框架发布后的二进制文件过大的问题存在了很长时间,我在这篇文章中有过详细的讨论,好在 Windows App SDK v1.2 就已经支持剪裁发布,但是我却一直没 ...

  7. 2020.11.30【NOIP提高A组】模拟

    总结与反思 很不幸,估分 \(170\),可惜 \(T2\) 暴力 \(50pts\) 全掉了 \(T1\) 结论题,如果想到了,\(O(n)\) 过,只有十几行代码 感觉不好想,不过还是 \(A\) ...

  8. 内网安全之:Windows系统帐号隐藏

    Windows系统帐号隐藏 目录 Windows系统帐号隐藏 1 CMD下创建隐藏账户 2 注册表创建隐藏账户 3 利用工具隐藏账户 1 CMD下创建隐藏账户 CMD下创建隐藏账户 net user ...

  9. pdf地址展示成Swiper轮播方式-复制链接

    1.安装vue-pdf插件,swiper插件.clipboard npm install vue-pdf -snpm install swiper -Snpm install clipborad -S ...

  10. CF837G - Functions On The Segments

    我们考虑 \(\sum_{i=l}^r{f_i(x)}\) 是个什么东西.首先这个奇怪的东西很好离线做,所以尽管题目要求强制在线,我们还是离线下来试试. 我们发现,我们可以 \(x\) 坐标从 \(1 ...