• Go从入门到精通——带缓冲的通道


    带缓冲的通道

      在无缓冲通道的基础上,为通道增加一个有限大小的存储空间形成带缓冲通道。

      带缓冲通道在发送时无需等待接收方接收即可完成发送过程,并且不会发生阻塞,只有当存储空间满时,才会发生阻塞。

      带缓冲通道有数据时,接收方将不会发生阻塞,直到通道中没有数据可读时,通道将会再读阻塞。

    1、创建带缓冲通道

      格式如下:

    通道实例 := 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))
    }
    

    2、阻塞条件

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

      • 带缓冲通道被填满时,尝试再次发送数据时发生阻塞。
      • 带缓冲通道为空时,尝试接收数据时发生阻塞。

    提示:

        为什么 Go 语言对通道要限制长度,而不是提供无限长度的通道?
        因为通道一方提供数据,一方接收数据。如果一方的数据供给速度大于另外一方接收的速度,会造成内存不断膨胀而应用崩溃。因此限制通道的长度有利于约束数据提供方的供给速度,供给数据量必须在接收方处理量+通道长度的范围以内,才能正常地处理数据。
  • 相关阅读:
    安装 windows 2008 解决 gpt 分区问题
    you have not created a boot efi partition
    echarts gauge 仪表盘去除外发光效果
    上国际网络——通过配置host
    juery 选择器 选择多个元素
    html5 <input> placeholder 属性
    PHP——字符串统一转码为GBK,自动判断是否UTF8并转码
    sublime text2 解决中文乱码
    PHP超级全局变量——Session 变量
    js为元素添加onclick事件
  • 原文地址:https://www.cnblogs.com/zuoyang/p/16257445.html
Copyright © 2020-2023  润新知