退出程序时,防止无缓存的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
    任务完成
    
  • 总结

    • 退出程序的时候,将生产者关闭,不会产生多余的数据给消费者消费
posted @   Myuniverse  阅读(1757)  评论(0编辑  收藏  举报
编辑推荐:
· 从 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)
点击右上角即可分享
微信分享提示