golang模版-使用close关闭chan来规避chan阻塞导致的协程泄漏

本文探讨了在Golang中,如何通过close操作解除读取chan的阻塞,以防止因chan未关闭导致的协程泄漏。分析了waitgroup与close的不同之处,close可以在不写入数据的情况下允许读取,从而让阻塞的goroutine运行完成。同时提出了在实际应用中如何封装和扩展这一机制,例如设置关闭时间、超时处理等策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

close 解除读取 chan 阻塞

上方的例子是通过 waitgroup 等待让所有的 goroutine 都运行完毕之后,wait 函数才会被放行(注意加上超时处理)。试想一下存在这样的琴况,如果 wait 函数要等待所有 goroutine 结束才能放行,可是这些 gouroutine 因为从 chan 读取不到数据而造成阻塞,则这些 goroutine 可能一直陷入阻塞,而 wait 函数也一直无法放行,就有可能陷入死锁,所以我们有另一种思考,如果不是 wait 函数固执的希望所有 goroutine 必须都要等待他们自己处理完 wait 函数才能继续执行呢?我们假如把 wait 函数考虑换成一种方式可以让 chan 虽然读取不到数据但是依然可以解除 chan 阻塞让 goroutine 运行完成呢?我们也可以看看下面伪代码

// 一个 chan
c := make(chan int)

// 开启多协程,匿名
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

abcnull

您的打赏是我创作的动力之一

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值