|版权声明:本文为博主原创文章,未经博主允许不得转载。博客地址:https://blog.csdn.net/sgsgy5

channel

我们先来看一下通道的解释:
channel是Go语言中的一个核心类型,可以把它看成管道。并发核心单元通过它就可以发送或者接收数据进行通讯,这在一定程度上又进一步降低了编程的难度。
channel是一个数据类型,主要用来解决go程的同步问题以及协程之间数据共享(数据传递)的问题。
goroutine运行在相同的地址空间,因此访问共享内存必须做好同步。goroutine 奉行通过通信来共享内存,而不是共享内存来通信。
引用类型 channel可用于多个 goroutine 通讯。其内部实现了同步,确保并发安全。

定义channel和使用

和map类似,channel也一个对应make创建的底层数据结构的引用。
当我们复制一个channel或用于函数参数传递时,我们只是拷贝了一个channel引用,因此调用者和被调用者将引用同一个channel对象。和其它的引用类型一样,channel的零值也是nil。
定义一个channel时,也需要定义发送到channel的值的类型。channel可以使用内置的make()函数来创建:
我们先来看一段代码

package main
import "fmt"
func main(){ch:=make(chan int) //这里就是创建了一个channel,这是无缓冲管道注意go func(){                  //创建子go程for i:=0;i<6;i++{ch<-i     //循环写入管道fmt.Println("写入",i)}}()for i:=0;i<6;i++{      //主go程num:=<-ch         //循环读出管道fmt.Println("读出",num)}
}

我们先看一下运行结果再来看代码:

我们在代码中 先创建了一个匿名函数的子go程,和main的主go程一起争夺cpu,但是我们在里面创建了一个管道,无缓冲管道有一个规则那就是必须读写同时操作才会有效果,如果只进行读或者只进行写那么会被阻塞,被暂时停顿等待另外一方的操作,在这里我们定义了一个容量为0的通道,这就是无缓冲通道,如下图

无缓冲通道就是这样,一次只能传输一个数据
总结一下就是无缓冲特性:
同一时刻,同时有 读、写两端把持 channel。
如果只有读端,没有写端,那么 “读端”阻塞。
如果只有写端,没有读端,那么 “写端”阻塞。
读channel: <- channel
写channel: channel <- 数据

有缓冲channel

如图所示:

. 在第 1 步,右侧的 goroutine 正在从通道接收一个值。
在第 2 步,右侧的这个 goroutine独立完成了接收值的动作,而左侧的 goroutine 正在发送一个新值到通道里。
在第 3 步,左侧的goroutine 还在向通道发送新值,而右侧的 goroutine 正在从通道接收另外一个值。这个步骤里的两个操作既不是同步的,也不会互相阻塞。
最后,在第 4 步,所有的发送和接收都完成,而通道里还有几个值,也有一些空间可以存更多的值。
有缓冲通道就是图中所示,一方可以写入很多数据,不用等对方的操作,而另外一方也可以直接拿出数据,不需要等对方写,但是注意一点(如果写入的一方把channel写满了,那么如果要继续写就要等对方取数据后才能继续写入,这也是一种阻塞,读出数据也是一样,如果里面没有数据则不能取,就要等对方写入),而有缓冲channel定义也比较简单

ch:=make(chan int,10)//chan int 只能写入读入int类型的数据,10代表容量为10.

这里用了自动推导类型来声明了一个有缓冲的channel
总结起来就是:
channel 中自带缓冲区。创建时可以指定缓冲区的大小。
w:直到缓冲区被填满后,写端才会阻塞。
r:缓冲区被读空,读端才会阻塞。
len:代表缓冲区中,剩余元素个数,
cap:代表缓冲区的容量。
在这里可以举个小小的例子来解释一下有缓冲channel和无缓冲channel
同步通信: 数据发送端,和数据接收端,必须同时在线。 —— 无缓冲channel
打电话。打电话只有等对方接收才会通,要不然只能阻塞

异步通信:数据发送端,发送完数据,立即返回。数据接收端有可能立即读取,也可能延迟处理。 —— 有缓冲channel 不用等对方接受,只需发送过去就行
发信息。短信。
是不是很形象呢
下一节将讲解一下channel常见的陷阱以及关闭channel

go之无缓冲channel(通道)和有缓冲channel(通道)相关推荐

  1. 深度学习每层的通道数如何计算_模型通道剪枝之DMCP: Differentiable Markov Channel Pruning...

    模型压缩的目的是减小模型计算量(FLOPs or MACC).减小模型参数量/体积.减小模型的推理时间(latency).主要方法有知识蒸馏.紧凑网络设计.剪枝.量化.低秩近似等.今天分享一篇通道剪枝 ...

  2. NIO 学习(三) channel(主要介绍channel----FileChannel详解--通道间的信息传输)

    Channel实现 Java NIO中最重要的通道的实现: FileChannel :从文件中读写数据 DatagramChannel :通过UDP读写网络中的数据 SocketChannel  :通 ...

  3. 7.嵌入式控制器EC实战 ACPI规范中的电源管理通道PMC(Power Management Channel)

    文章目录 前言 一.电源管理通道PMC概述 二.通过电源管理通道PMC完成EC和BIOS或操作系统通信 操作系统或BIOS通过PMC通道与EC通信 如果PMSTS的BIT2为1时,代表发送过来的信息是 ...

  4. [PS基础] Photoshop通道在图像处理中的应用 —通道起源

    Photoshop通道在图像处理中的应用 -通道起源 如果问"什么是 photops 中最重要.最不可缺少的功能?"相信很多人的回答是"图层".其实,在  ph ...

  5. 【Flutter】Flutter 混合开发 ( Flutter 与 Native 通信 | 通信场景 | Channel 通信机制 | Channel 支持的通信数据类型 | Channel 类型 )

    文章目录 一.Flutter 和 Native 应用之间的通信场景 二.Flutter 和 Native 的 Channel 通信机制 三.Channel 通信机制支持的数据类型 四.Channel ...

  6. 《WCF技术内幕》翻译31:第2部分_第6章_通道:概述与正确认识通道。

    Chapter 6: Channels 第6章:通道(Channel) Overview 概述 Channels in Perspective 正确认识Channel The Channel Stat ...

  7. 5.1数据采集通道搭建之业务数据采集通道搭建

    数据采集通道搭建之业务数据采集通道搭建 1.数据同步策略分析 1.1常见的数据同步策略 我们每天都需要从数据库中将业务数据同步到数据仓库当中,对于离线数仓来说,各项指标计算的周期一般为天,因此,我们数 ...

  8. 95epay支付通道种类:3D通道,实时非3D通道,高级延时非3D通道,高级实

    ◆|95epay支付通道种类:3D通道,实时非3D通道,高级延时非3D通道,高级实 时非3D通道,高级4S通道.(国内通道最优,商家有保障性) ◆|功能.优势:VISA + MASTERCARD + ...

  9. 图片一:单通道、三通道、灰度图、黑白图、三通道转灰度图(单通道)

    图片的概念经常搞不清楚,导致对图片处理很糟糕.感觉还是总结下比较好,省的每次都要找一堆博客看.下面的内容是博主个人理解,不能保证全部正确,如有错误,敬请指出. 1.图片:通常指的是数字图片,数据结构通 ...

最新文章

  1. Step By Step(Lua调用C函数)
  2. 从十个方面提升SharePoint网站性能
  3. unity json mysql_unity——json总结
  4. PANEL中显示窗体
  5. 编译原理—语义分析(Java)
  6. node 测试生成模拟用户数据
  7. 河南招教考试计算机专业知识,河南教师招聘考试《计算机网络技术基础》知识点归纳七...
  8. Magento 创建唯一优惠券 Create unique coupon code in Magento
  9. 中国企业2017年数据_根据数据,2017年最好的免费在线课程
  10. 博客系统如何随机插入大量文章数据
  11. 机器人三定律真有用?但AI可能并不会遵守
  12. windows环境的python的环境变量_win的环境变量配置(Python实例)
  13. 快速搭建一个Express工程骨架
  14. Java自带工具包StringUtils包含方法
  15. 高等数学——二重积分的计算方法
  16. 疫情期间大学生在线学习效果调查报告
  17. html怎么画虚线空心圆,PS怎么画虚线圆圈 一个工具轻松搞定
  18. 配置华为防火墙接口IP地址和区域
  19. 1.5 人工智能迅速发展的技术领域
  20. 2万字 + 50 张图,细说 JVM 内存分布、内存对齐、压缩指针

热门文章

  1. 智能玩具存在的安全隐患须知
  2. 机器学习从入门到创业手记-初识sklearn
  3. 代码主题darcula_设置 IntelliJ IDEA 的彩色代码主题
  4. 进阶篇:3.5)粉末冶金件设计
  5. pythonQQ机器人系列(基于go-cqhttp):使用requests和socket实现QQ机器人聊天(2-0)
  6. Cowboy 源码分析(十一)
  7. 【Web前端HTML5CSS3】12-字体
  8. 现在,您可以在YouTube上播放免费的,广告支持的电影
  9. 数据库原理——实验二《数据查询》
  10. 给服务器下载补丁及安装补丁