• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Go语言带缓冲的通道实现

    Go语言中有缓冲的通道(buffered channel)是一种在被接收前能存储一个或者多个值的通道。这种类型的通道并不强制要求 goroutine 之间必须同时完成发送和接收。通道会阻塞发送和接收动作的条件也会不同。只有在通道中没有要接收的值时,接收动作才会阻塞。只有在通道没有可用缓冲区容纳被发送的值时,发送动作才会阻塞。

    这导致有缓冲的通道和无缓冲的通道之间的一个很大的不同:无缓冲的通道保证进行发送和接收的 goroutine 会在同一时间进行数据交换;有缓冲的通道没有这种保证。

    在无缓冲通道的基础上,为通道增加一个有限大小的存储空间形成带缓冲通道。带缓冲通道在发送时无需等待接收方接收即可完成发送过程,并且不会发生阻塞,只有当存储空间满时才会发生阻塞。同理,如果缓冲通道中有数据,接收时将不会发生阻塞,直到通道中没有数据可读时,通道将会再度阻塞。

    无缓冲通道保证收发过程同步。无缓冲收发过程类似于快递员给你电话让你下楼取快递,整个递交快递的过程是同步发生的,你和快递员不见不散。但这样做快递员就必须等待所有人下楼完成操作后才能完成所有投递工作。如果快递员将快递放入快递柜中,并通知用户来取,快递员和用户就成了异步收发过程,效率可以有明显的提升。带缓冲的通道就是这样的一个“快递柜”。

    创建带缓冲通道

    如何创建带缓冲的通道呢?参见如下代码:

    通道实例 := make(chan 通道类型, 缓冲大小)

    下面通过一个例子中来理解带缓冲通道的用法,参见下面的代码:

    package main
    import "fmt"
    func main() {
        // 创建一个3个元素缓冲大小的整型通道
        ch := make(chan int, 3)
        // 查看当前通道的大小
        fmt.Println(len(ch))
        // 发送3个整型元素到通道
        ch - 1
        ch - 2
        ch - 3
        // 查看当前通道的大小
        fmt.Println(len(ch))
    }
    

    代码输出如下:
    0
    3

    代码说明如下:

    阻塞条件

    带缓冲通道在很多特性上和无缓冲通道是类似的。无缓冲通道可以看作是长度永远为 0 的带缓冲通道。因此根据这个特性,带缓冲通道在下面列举的情况下依然会发生阻塞:

    为什么Go语言对通道要限制长度而不提供无限长度的通道?

    我们知道通道(channel)是在两个 goroutine 间通信的桥梁。使用 goroutine 的代码必然有一方提供数据,一方消费数据。当提供数据一方的数据供给速度大于消费方的数据处理速度时,如果通道不限制长度,那么内存将不断膨胀直到应用崩溃。因此,限制通道的长度有利于约束数据提供方的供给速度,供给数据量必须在消费方处理量+通道长度的范围内,才能正常地处理数据。

    到此这篇关于Go语言带缓冲的通道实现的文章就介绍到这了,更多相关Go语言带缓冲通道内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    您可能感兴趣的文章:
    • golang中切片copy复制和等号复制的区别介绍
    • go切片的copy和view的使用方法
    • go语言中切片与内存复制 memcpy 的实现操作
    • Go语言中的UTF-8实现
    • golang中实现给gif、png、jpeg图片添加文字水印
    • go语言求任意类型切片的长度操作
    • Go语言切片前或中间插入项与内置copy()函数详解
    上一篇:go语言求任意类型切片的长度操作
    下一篇:golang中实现给gif、png、jpeg图片添加文字水印
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    Go语言带缓冲的通道实现 语言,带,缓冲,的,通道,实现,