退出程序时,防止无缓存的channel没有消费完的方法
-
参考代码
package main import( "fmt" "sync" "time" "runtime" ) var wg sync.WaitGroup // 生产者 func Send(ch chan int){ x:=0 defer func(){ if err:=recover();err!=nil && err.(runtime.Error).Error() == "send on closed channel"{ fmt.Println(err) fmt.Println("即将产生的数据:",x) }else{ close(ch) //关闭的目的:不在发送数据 } wg.Done() }() for i:=0;i<10;i++{ x++ ch <- x } } // 消费者 func Receive(ch chan int){ defer func(){ if err:=recover();err!=nil{ fmt.Println(err) close(ch) //关闭的目的:不要让生产者继续发送数据 fmt.Println(<-ch) //继续消费,输出结果为0,说明已经不会生产者已经不会再发送数据了 } wg.Done() }() for x:= range ch { time.Sleep(time.Second) fmt.Println(x) if x==3{ panic("发生意外的错误") //中断主程序,但是协程还是不会关闭的 } } fmt.Println("Receive任务结束") } func main(){ fmt.Println("退出程序时,防止channel没有消费完") ch := make(chan int) wg.Add(2) go Send(ch) go Receive(ch) wg.Wait() fmt.Println("任务完成") _,ok:=<- ch fmt.Println(ok) }
-
输出结果
退出程序时,防止channel没有消费完 1 2 3 发生意外的错误 0 send on closed channel 即将产生的数据: 4 任务完成
-
总结
- 退出程序的时候,将生产者关闭,不会产生多余的数据给消费者消费
分类:
go语言学习
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)