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。
回首忆惘然
TA贡献1847条经验 获得超11个赞
另一个有用的例子,我偶然发现了这个漂亮的实现的环形缓冲区。
引自来源:
这个想法很简单:通过一个 Goroutine 连接两个缓冲通道,该 Goroutine 将消息从传入通道转发到传出通道。每当无法将新消息放置在传出通道上时,从传出通道中取出一条消息(即缓冲区中最旧的消息),将其丢弃,然后将新消息放置在新释放的传出通道中。
也看看这个 C 版本......
- 3 回答
- 0 关注
- 166 浏览
添加回答
举报
0/150
提交
取消