+ 收藏我们

网站模板

网站模板搜索
404模板 营销型模板 外贸网站模板 单页模板 双语模板 标签大全
电话:18630701785
首页 > 站长学院 > 了解 Go 通道处理/缓冲区溢出 >

了解 Go 通道处理/缓冲区溢出

时间:2024-04-06 14:43:19

珍惜时间,勤奋学习!今天给大家带来《了解 Go 通道处理/缓冲区溢出》,正文内容主要涉及到等等,如果你正在学习golang,或者是对Golang有疑问,欢迎大家关注我!后面我会持续更新相关内容的,希望都能帮到正在学习的大家!

问题内容
我继承了一些我仍在试图理解的代码。其核心是:

for msg := range this.out {
    for i, handler := range this.handlers {
        select {
        case handler <- msg:
        default:
            this.logger.Printf("Buffer overflow occurred for handler %s", this.names[i])
        }
    }
}
输出是一个 chan byte 处理程序是 []chan []byte

它看起来就像从数组中读取并写入处理程序,默认情况是抱怨缓冲区溢出。我想。

但我需要详细信息。我是新来的,这是我第一次和陈打交道。所以第一个问题,这真的是这里发生的事情吗?如果是这样......我如何防止缓冲区溢出?


正确答案

在 go 中,可以通过两种方式创建通道:

c := make(chan []byte)
它创建一个同步发送者和接收者的通道。这意味着接收方必须等待发送方发送数据,发送方也必须等待接收方收到该数据。但是,通过向通道添加缓冲区:

c := make(chan []byte, 100)
您实际上使发送者和接收者失去了同步。在这种情况下,当缓冲区已满时,发送方将阻塞,而当缓冲区为空时,接收方将阻塞。

现在,我不知道 handler 的容量是多少,但这是您应该期望的一般工作流程:

go 会检查 handler 是否有空间,如果有,则将 msg 写入通道。
如果没有空间,则会记录错误消息。
您实际上对缓冲区溢出所做的事情有点棘手。

首先,作为权宜之计,您可以增加 handler 的容量,以便它可以容纳更多消息。如果问题是间歇性的(即流量出现大幅峰值),这可能代表实际的修复。否则,您所做的只是将问题暂时推迟。

其次,您可以水平缩放 handler 另一端的处理程序以处理更多消息,从而确保通道不会溢出。然而,这样做的问题是,您必须担心管理各种容量级别的处理程序,然后您就需要进行自动扩展和类似的事情。

第三,您可以查看处理来自 handler 的消息的代码,看看是否可以重新设计以更有效地处理消息。当代码的原始设计假设不再成立时,这种重新设计非常常见。

最后,您可以完全放弃使用通道作为基础设施,并用包含内存的基于云的发布/订阅来替换该组件。这样做的优点是,这将允许您根据需要扩展应用程序,而不必担心溢出,但这会产生额外的成本并需要更改基础设施。

有问题可以加入网站技术QQ群一起交流学习

本站会员学习、解决问题QQ群(691961965)

客服微信号:lpf010888

pbootcms教程

织梦教程

站长学院

SEO

wordpress

竞价教程

信息流

Title