GoLong的学习之路,进阶,语法之并发(并发错误处理)补充并发三部曲
这篇文章主要讲的是如何去处理并发的错误。
在Go语言中十分便捷地开启goroutine去并发地执行任务,但是如何有效的处理并发过程中的错误则是一个很棘手的问题。
文章目录
- recover
- errgroup
recover
哦对,似乎没写错误处理的文章。后面补上。
首先,这里的recover通常用来错误处理。
我们可以在代码中使用 recover 来会恢复程序中弹出的 panic,而 panic 只会触发当前 goroutine 中的 defer 操作。
func f1() {defer func() {if e := recover(); e != nil {fmt.Printf("recover panic:%v\n", e)}}()// 开启一个goroutine执行任务go func() {fmt.Println("in goroutine....")// 只能触发当前goroutine中的deferpanic("panic in goroutine")}()time.Sleep(time.Second)fmt.Println("exit")
}
func main() {f1()
}

从输出结果可以看到程序并没有正常退出,而是由于 panic 异常退出了(exit code 2)。
正如上面示例演示的那样,在启用 goroutine 去执行任务的场景下,如果想要 recover goroutine中可能出现的 panic 就需要在 goroutine 中使用 recover。

程序中的 panic 被 recover 成功捕获,程序最终正常退出。
errgroup
我们通常在使用goroutine是 调用一个函数或匿名函数
go func(){// ...
}go foo()
并发的那些函数,其实很难拿的准。错误信息只多不少。
当我们想要将一个任务拆分成多个子任务交给多个 goroutine 去运行,这时我们该如何获取到子任务可能返回的错误呢?
// fetchUrlDemo 并发获取url内容
func FetchUrlDemo() {wg := sync.WaitGroup{}var urls = []string{"http://www.baidu.com","http://www.qq.com","http://www.nihaosfasdfasdf.com",}for _, url := range urls {wg.Add(1)go func(url string) {defer wg.Done()resp, err := http.Get(url)if err == nil {fmt.Printf("获取%s成功\n", url)resp.Body.Close()}return // 如何将错误返回呢?}(url)}wg.Wait()// 如何获取goroutine中可能出现的错误呢?
}
上面的示例代码中,我们开启了 3 个 goroutine 分别去获取3个 url 的内容。
类似这种将任务分为若干个子任务的场景会有很多,那么我们如何获取子任务中可能出现的错误呢?
errgroup 包就是为了解决这类问题而开发的.
它能为处理公共任务的子任务而开启的一组 goroutine 提供同步、error 传播和基于context 的取消功能。
errgroup 包中定义了一个 Group 类型,它包含了若干个不可导出的字段。
type Group struct {cancel func()wg sync.WaitGrouperrOnce sync.Onceerr error
}
errgroup.Group 提供了Go和Wait两个方法。
Go : func (g *Group) Go(f func() error)
-
Go 函数会在新的 goroutine 中调用传入的函数f。
-
第一个返回非零错误的调用将取消该Group;下面的Wait方法会返回该错误
Wait:func (g *Group) Wait() error
Wait会阻塞直至由上述Go 方法调用的所有函数都返回,然后从它们返回第一个非nil的错误(如果有)
// fetchUrlDemo2 使用errgroup并发获取url内容
func fetchUrlDemo2() error {g := new(errgroup.Group) // 创建等待组(类似sync.WaitGroup)var urls = []string{"http://www.4399.com","http://www.baidu.com","http://www.sdhfjoahoesrh.com",}for _, url := range urls {url := url // 注意此处声明新的变量// 启动一个goroutine去获取url内容g.Go(func() error {resp, err := http.Get(url)if err == nil {fmt.Printf("获取%s成功\n", url)resp.Body.Close()}return err // 返回错误})}if err := g.Wait(); err != nil {// 处理可能出现的错误fmt.Println(err)return err}fmt.Println("所有goroutine均成功")return nil
}func main() {fetchUrlDemo2()}

当子任务的 goroutine 中对,http://www.sdhfjoahoesrh.com,发起 HTTP 请求时会返回一个错误,这个错误会由 errgroup.Group 的 Wait 方法返回。

通过阅读 errgroup.Group 的 Go 方法源码,我们可以看到当任意一个函数 f 返回错误时,会通过g.errOnce.Do只将第一个返回的错误记录,并且如果存在 cancel 方法则会调用cancel。
那么如何创建带有 cancel 方法的 errgroup.Group ?
func WithContext(ctx context.Context) (*Group, context.Context)
WithContext 函数接收一个父 context,返回一个新的 Group 对象和一个关联的子 context 对象。
相关文章:
GoLong的学习之路,进阶,语法之并发(并发错误处理)补充并发三部曲
这篇文章主要讲的是如何去处理并发的错误。 在Go语言中十分便捷地开启goroutine去并发地执行任务,但是如何有效的处理并发过程中的错误则是一个很棘手的问题。 文章目录 recovererrgroup recover 哦对,似乎没写错误处理的文章。后面补上。 首先&…...
猪酒店房价采集
<?php // 设置代理 $proxy_host jshk.com.cn;// 创建一个cURL资源 $ch curl_init();// 设置代理 curl_setopt($ch, CURLOPT_PROXY, $proxy_host.:.$proxy_port);// 连接URL curl_setopt($ch, CURLOPT_URL, "http://www.zujia.com/");// 发送请求并获取HTML文档…...
Java基础知识第四讲:Java 基础 - 深入理解泛型机制
Java 基础 - 深入理解泛型机制 背景:Java泛型这个特性是从JDK 1.5才开始加入的,为了兼容之前的版本,Java泛型的实现采取了“伪泛型”的策略,即Java在语法上支持泛型,但是在编译阶段会进行所谓的“类型擦除”࿰…...
ceph-deploy bclinux aarch64 ceph 14.2.10【2】vdbench rbd 块设备rbd 测试失败
上篇 ceph-deploy bclinux aarch64 ceph 14.2.10-CSDN博客 安装vdbench 下载vdbench 下载页面 Vdbench Downloads (oracle.com) 包下载 需要账号登录,在弹出层点击同意才能继续下载 用户手册 https://download.oracle.com/otn/utilities_drivers/vdbench/vdb…...
split_train_val
# coding:utf-8 import os import random import argparse parser argparse.ArgumentParser() # xml文件的地址,根据自己的数据进行修改 xml一般存放在Annotations下 parser.add_argument(--xml_path, defaultdata_door_white/xml/train, typestr, helpinput xm…...
Linux Mint 21.3 将搭载 Cinnamon 6.0 和实验性 Wayland 支持
导读Wayland 会话可能在 Linux Mint 23 系列中成为默认选项,预计将在 2026 年实现。 Linux Mint 项目今天在他们的每月新闻通讯中 宣布,他们已经开始着手在未来的 Linux Mint 发行版中实施 Wayland 会话,最初将在 Linux Mint 21.3 中提供。 …...
名师助阵龙讯旷腾PWmat+半导体缺陷培训暨半导体缺陷计算大赛
半导体缺陷计算大赛 选拔赛截止日期:11月23日 参与杭州线下培训直接跳过选拔赛 大赛亮点 线上免费培训、线下限时领取免费名额 线下杭州培训可直通决赛,跳过选拔赛 线上培训有3次机会参与考试进入决赛 已购/未购用户均可参加、无身份限定 使用Mc…...
Kotlin与Java写法的变更
目录 获取类的Java Class属性 类型检查 for循环 switch语句 if判断 获取类的Java Class属性 //Java Intent intent new Intent(this, MainActivity.class);//Kotlin val intent Intent(this, MainActivity::class.java) 类型检查 //Java apple instanceof Fruit !(app…...
京东数据软件系统:京东销量和销额数据在哪里看?
京东平台店铺众多,行业同行也数不胜数,若想要在平台中更好的运营店铺,品牌需要做好数据分析。下面结合鲸参谋电商数据分析平台这一数据分析工具,我们来看一看品牌在做数据分析时需要注重哪些数据维度。 *行业数据 京东商家通过鲸…...
美观且功能丰富的控制台:5个.Net开源项目
今天一起盘点下,9月份推荐的5个.Net开源项目(点击标题查看详情)。 1、FTP开源库 FluentFTP是一个基于.Net开发的,可用于FTP和FTPS文件传输。该项目优化了速度,并提供简单易用的API,让开发人员可以快速地集…...
深度学习模型基于Python+TensorFlow+Django的垃圾识别系统
欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 要使用Python、TensorFlow和Django构建一个垃圾识别系统,您可以按照以下步骤进行操作: 安装…...
ArcGIS Pro怎么生成山顶点
山顶点是指山脉、山丘或山脉系统中最高的地点,通常是山的最高峰,这是山地地貌中的最高点,往往是山脉的标志性特征之一,这里为大家介绍一下如何使用ArcGIS Pro获取山顶点,希望能对你有所帮助。 数据来源 本教程所使用…...
Anolis 8.6 安装 Drawio
Anolis 8.6 安装 Drawio 22.1.0 一.RPM版(不建议)二.WAR 包部署 一.RPM版(不建议) Draw RPM 包下载链接 RPM 包直接基于Linux图形化能力部署,服务器类型的Linux系统启动RPM包安装的Draw可能比较复杂 系统版本 ## 1.…...
AI图像生成模型LCMs: 四个步骤就能快速生成高质量图像的新方法
在最新的AI模型和研究领域,一种名为Latent Consistency Models(LCMs)的新技术正迅速推动文本到图像人工智能的发展。与传统的Latent Diffusion Models(LDMs)相比,LCMs在生成详细且富有创意的图像方面同样出色,但仅需1-…...
成都瀚网科技有限公司抖音带货正规
随着互联网的蓬勃发展,越来越多的公司开始利用网络平台进行产品销售。其中,抖音作为一款广受欢迎的短视频平台,已经成为众多商家眼中的“香饽饽”。在这场电商狂欢中,成都瀚网科技有限公司(以下简称“瀚网科技”&#…...
php 8 注解的实际应用
前言 学过java的同学应该都知道注解的作用,但是在php中注解有什么用呢?我的理解就是美化代码和便于维护一些类的设计。 说明 我们先设计一个类,声明人类的性别 <?php class Sex {//男人const MAN 1;//女人const WIFE 2;//未知const…...
【数据结构】树与二叉树(十三):递归复制二叉树(算法CopyTree)
文章目录 5.2.1 二叉树二叉树性质引理5.1:二叉树中层数为i的结点至多有 2 i 2^i 2i个,其中 i ≥ 0 i \geq 0 i≥0。引理5.2:高度为k的二叉树中至多有 2 k 1 − 1 2^{k1}-1 2k1−1个结点,其中 k ≥ 0 k \geq 0 k≥0。引理5.3&…...
相机突然断电,保存的DAT视频文件如何打开
3-6 本文主要解决因相机突然断电导致拍摄的视频文件打不开的问题。 在平常使用相机拍摄视频,比如使用佳能相机拍摄视频的时候,如果电池突然断电,就非常有可能会导致视频没来得及保存而损坏的情况,比如会产生下图中的这种DAT文件…...
[西湖论剑 2022]real_ez_node
文章目录 前置知识EJS模板注入(CVE-2022-29078)原型链污染漏洞 (CVE-2021-25928)HTTP响应拆分攻击(CRLF) 解题过程代码审计构造payload 前置知识 EJS模板注入(CVE-2022-29078) EJS…...
如何正确使用GPT工具
引言 在快速发展的数字时代,人工智能(AI)已成为科研领域的一个不可或缺的工具。特别是像ChatGPT这样的AI聊天机器人,它通过高效的语言模型和深度学习算法,为科研工作者提供了前所未有的辅助。从文献搜索到数据分析&…...
C# 13 Span<T>扩展应用实战:5个真实场景性能提升300%+的零GC编码技巧
第一章:C# 13 Span扩展应用概览Span 自 C# 7.2 引入以来,已成为高性能内存操作的核心类型;C# 13 进一步强化其生态支持,通过编译器优化、更宽松的泛型约束以及与源生成器(Source Generators)的深度协同&…...
OpenClaw+百川2-13B-4bits:自动化生成周报并邮件发送实战
OpenClaw百川2-13B-4bits:自动化生成周报并邮件发送实战 1. 为什么选择这个组合方案 作为一位长期被周报折磨的开发者,我一直在寻找能解放双手的自动化方案。传统模板化周报工具缺乏灵活性,而纯手工编写又耗时费力。直到发现OpenClaw与百川…...
GLM-4.1V-9B-Base部署案例:高校AI通识课实验平台快速搭建实践
GLM-4.1V-9B-Base部署案例:高校AI通识课实验平台快速搭建实践 1. 项目背景与需求分析 高校AI通识课程面临一个普遍挑战:如何让学生直观理解多模态AI的能力?传统教学往往停留在理论讲解或简单演示层面,学生缺乏动手实践机会。GLM…...
别再只用WinForm了!用Godot 4.2给西门子PLC做个炫酷3D监控界面(附完整C#源码)
工业自动化新视界:用Godot 4.2打造PLC三维监控系统的实战指南 当传统工控界面遇上现代游戏引擎技术,会碰撞出怎样的火花?在工业4.0时代,设备监控系统早已不再满足于简单的二维图表和静态指示灯。想象一下:通过逼真的三…...
强力解锁B站字幕:跨平台字幕下载与转换完整方案
强力解锁B站字幕:跨平台字幕下载与转换完整方案 【免费下载链接】BiliBiliCCSubtitle 一个用于下载B站(哔哩哔哩)CC字幕及转换的工具; 项目地址: https://gitcode.com/gh_mirrors/bi/BiliBiliCCSubtitle 你是否曾为B站视频的字幕无法下载而烦恼?想…...
5个维度深度解析GBFR Logs:让你的《碧蓝幻想:Relink》战斗数据可视化![特殊字符]
5个维度深度解析GBFR Logs:让你的《碧蓝幻想:Relink》战斗数据可视化!🎮 【免费下载链接】gbfr-logs GBFR Logs lets you track damage statistics with a nice overlay DPS meter for Granblue Fantasy: Relink. 项目地址: htt…...
别再只会用LMS了!从主动降噪耳机到语音识别,聊聊自适应滤波算法的实战选型
从主动降噪到语音增强:工程师视角下的自适应滤波算法选型指南 在嘈杂的咖啡厅里戴上降噪耳机的那一刻,背景噪音如潮水般退去;视频会议时,对方的声音突然变得清晰可辨——这些魔法般的体验背后,都藏着一个关键角色&…...
2025年大模型技术演进:从DeepSeek到Omni全景回顾
1.大三下保研成功,当时就pytorch熟练,玩过一些小模型,大模型调api都不会。海面了好几家公司,靠以前的课题项目和pku一个研究院切合,拿了大模型算法实习生offer,实际上以rag清洗数据为主,在这边学…...
突破硬件限制:让老旧Mac焕发新生的5步实战指南
突破硬件限制:让老旧Mac焕发新生的5步实战指南 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 一、问题诊断:老旧Mac的困境与机遇 1.…...
Qwen3.5-9B 128K上下文应用:整套API文档索引构建+精准接口调用推荐
Qwen3.5-9B 128K上下文应用:整套API文档索引构建精准接口调用推荐 1. 项目概述与核心能力 Qwen3.5-9B是一款拥有90亿参数的开源大语言模型,在技术文档处理领域展现出强大的应用潜力。这个模型特别适合用于构建智能化的API文档系统,能够帮助…...
