为了账号安全,请及时绑定邮箱和手机立即绑定

如何知道缓冲通道已满

如何知道缓冲通道已满

Go
ABOUTYOU 2021-08-16 15:43:15
如何知道缓冲通道已满?我不知道在缓冲通道已满时被阻塞,而是选择删除发送到缓冲通道的项目。
查看完整描述

3 回答

?
繁星coding

TA贡献1797条经验 获得超4个赞

相反,我选择删除发送到缓冲通道的项目。


这称为“溢出通道”,您会发现 ANisus 的答案在eapache/channels/overflowing_channel.go以下位置实现:


for elem := range ch.input {

    // if we can't write it immediately, drop it and move on

    select {

    case ch.output <- elem:

    default:

    }

}

close(ch.output)

但是该项目eapache/channels 也实现了其他策略:


OverflowingChannelChannel以从不阻塞编写器的方式实现接口。

具体来说,如果一个值OverflowingChannel在其缓冲区已满时

(或者,在未缓冲的情况下,当接收者未准备好时)写入一个值,则该值将被简单地丢弃。

对于相反的行为(丢弃最旧的元素,而不是最新的),请参阅RingChannel。


查看完整回答
反对 回复 2021-08-16
?
回首忆惘然

TA贡献1847条经验 获得超11个赞

另一个有用的例子,我偶然发现了这个漂亮的实现的环形缓冲区。


引自来源:


这个想法很简单:通过一个 Goroutine 连接两个缓冲通道,该 Goroutine 将消息从传入通道转发到传出通道。每当无法将新消息放置在传出通道上时,从传出通道中取出一条消息(即缓冲区中最旧的消息),将其丢弃,然后将新消息放置在新释放的传出通道中。


也看看这个 C 版本......


查看完整回答
反对 回复 2021-08-16
  • 3 回答
  • 0 关注
  • 166 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信