news 2026/2/14 3:09:04

1.6 Go并发模式实战:Select、Context、WaitGroup三大并发原语深度应用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
1.6 Go并发模式实战:Select、Context、WaitGroup三大并发原语深度应用

1.6 Go并发模式实战:Select、Context、WaitGroup三大并发原语深度应用

引言

Go语言提供了丰富的并发原语,其中Select、Context和WaitGroup是最常用的三个。掌握它们的使用方法和最佳实践,是编写高质量并发程序的关键。本文将深入解析这三个并发原语的应用场景和实战技巧。

一、Select深度应用

1.1 Select多路复用

Select允许goroutine同时等待多个channel操作。

packagemainimport("fmt""time")funcmain(){ch1:=make(chanstring)ch2:=make(chanstring)ch3:=make(chanstring)gofunc(){time.Sleep(1*time.Second)ch1<-"来自ch1"}()gofunc(){time.Sleep(2*time.Second)ch2<-"来自ch2"}()gofunc(){time.Sleep(3*time.Second)ch3<-"来自ch3"}()// 等待任意一个channel有数据select{casemsg:=<-ch1:fmt.Println("收到:",msg)casemsg:=<-ch2:fmt.Println("收到:",msg)casemsg:=<-ch3:fmt.Println("收到:",msg)}}

1.2 Select实现优先级

packagemainimport("fmt""time")funcmain(){highPriority:=make(chanstring)lowPriority:=make(chanstring)gofunc(){fori:=0;i<5;i++{lowPriority<-fmt.Sprintf("低优先级%d",i)time.Sleep(200*time.Millisecond)}}()gofunc(){time.Sleep(500*time.Millisecond)highPriority<-"高优先级消息"}()fori:=0;i<5;i++{select{casemsg:=<-highPriority:fmt.Println("处理:",msg)casemsg:=<-lowPriority:fmt.Println("处理:",msg)}}}

1.3 Select实现超时控制

packagemainimport("fmt""time")funcfetchData(chchan<-string){// 模拟耗时操作time.Sleep(3*time.Second)ch<-"数据获取成功"}funcmain(){ch:=make(chanstring)gofetchData(ch)select{caseresult:=<-ch:fmt.Println("成功:",result)case<-time.After(2*time.Second):fmt.Println("请求超时")}}

1.4 Select实现心跳检测

packagemainimport("fmt""time")funcworker(heartbeat<-chantime.Time,done<-chanstruct{}){for{select{case<-heartbeat:fmt.Println("收到心跳")case<-done:fmt.Println("工作完成")return}}}funcmain(){heartbeat:=time.NewTicker(500*time.Millisecond)done:=make(chanstruct{})goworker(heartbeat.C,done)time.Sleep(3*time.Second)close(done)heartbeat.Stop()}

二、Context深度应用

2.1 Context基础

Context用于在goroutine之间传递取消信号、超时和截止时间。

packagemainimport("context""fmt""time")funcdoWork(ctx context.Context){for{select{case<-ctx.Done():fmt.Println("工作被取消")returndefault:fmt.Println("工作中...")time.Sleep(500*time.Millisecond)}}}funcmain(){ctx,cancel:=context.WithCancel(
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/7 10:42:26

AI在并发测试中的突破:高负载处理方案

并发测试的演进与AI的变革角色 并发测试是软件测试的核心领域&#xff0c;旨在模拟海量用户同时访问系统&#xff0c;以评估其在高负载下的性能、稳定性和可扩展性。传统方法依赖人工脚本和线性模型&#xff0c;但面对现代应用的复杂性&#xff08;如电商大促或实时交易系统&a…

作者头像 李华
网站建设 2026/2/10 2:26:53

【大数据毕设全套源码+文档】基于springboot+Hadoop的养老院数据分析与可视化设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/2/12 11:43:15

收藏!技术寒冬破局指南:大模型应用开发成程序员小白新出路

不得不承认&#xff0c;近段时间技术圈的整体环境确实承压明显。随着互联网行业彻底告别增量扩张&#xff0c;全面进入存量竞争的深水区&#xff0c;“降本增效”成为所有企业的核心经营逻辑&#xff0c;这一趋势最直接的体现就是——传统软件开发岗位的HC持续收紧&#xff0c;…

作者头像 李华
网站建设 2026/2/6 22:17:27

导师严选9个AI论文网站,研究生高效写作必备!

导师严选9个AI论文网站&#xff0c;研究生高效写作必备&#xff01; AI 工具让论文写作更高效 在研究生阶段&#xff0c;论文写作是一项不可避免的重要任务。面对繁重的学术压力和严格的格式要求&#xff0c;许多学生都希望找到一种既能提高效率又能保证质量的工具。近年来&…

作者头像 李华
网站建设 2026/2/11 14:29:01

java求圆的面积代码,零基础入门到精通,收藏这篇就够了

在Java中&#xff0c;求圆的面积可以使用Math类的PI常量和pow方法。以下是一个简单的示例&#xff1a; public class CircleArea {public static void main(String[] args) {double radius 5.0;double area Math.PI * Math.pow(radius, 2);System.out.println("圆的面积…

作者头像 李华
网站建设 2026/2/8 18:41:39

收藏!228万年薪大模型岗刷屏:程序员/小白入局AI的高薪密码

不知道你是否有过这样的经历——刷社交平台时&#xff0c;总能被“别人的薪资”精准戳中痛点。尤其是当下爆火的AI赛道&#xff0c;百万年薪招聘启事、应届生薪资爆料刷屏不断&#xff0c;看着别人的职业起点&#xff0c;我们一边满心羡慕&#xff0c;一边又暗自觉得这份高薪遥…

作者头像 李华