go之无缓冲channel(通道)和有缓冲channel(通道)
|版权声明:本文为博主原创文章,未经博主允许不得转载。博客地址: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(通道)相关推荐
- 深度学习每层的通道数如何计算_模型通道剪枝之DMCP: Differentiable Markov Channel Pruning...
模型压缩的目的是减小模型计算量(FLOPs or MACC).减小模型参数量/体积.减小模型的推理时间(latency).主要方法有知识蒸馏.紧凑网络设计.剪枝.量化.低秩近似等.今天分享一篇通道剪枝 ...
- NIO 学习(三) channel(主要介绍channel----FileChannel详解--通道间的信息传输)
Channel实现 Java NIO中最重要的通道的实现: FileChannel :从文件中读写数据 DatagramChannel :通过UDP读写网络中的数据 SocketChannel :通 ...
- 7.嵌入式控制器EC实战 ACPI规范中的电源管理通道PMC(Power Management Channel)
文章目录 前言 一.电源管理通道PMC概述 二.通过电源管理通道PMC完成EC和BIOS或操作系统通信 操作系统或BIOS通过PMC通道与EC通信 如果PMSTS的BIT2为1时,代表发送过来的信息是 ...
- [PS基础] Photoshop通道在图像处理中的应用 —通道起源
Photoshop通道在图像处理中的应用 -通道起源 如果问"什么是 photops 中最重要.最不可缺少的功能?"相信很多人的回答是"图层".其实,在 ph ...
- 【Flutter】Flutter 混合开发 ( Flutter 与 Native 通信 | 通信场景 | Channel 通信机制 | Channel 支持的通信数据类型 | Channel 类型 )
文章目录 一.Flutter 和 Native 应用之间的通信场景 二.Flutter 和 Native 的 Channel 通信机制 三.Channel 通信机制支持的数据类型 四.Channel ...
- 《WCF技术内幕》翻译31:第2部分_第6章_通道:概述与正确认识通道。
Chapter 6: Channels 第6章:通道(Channel) Overview 概述 Channels in Perspective 正确认识Channel The Channel Stat ...
- 5.1数据采集通道搭建之业务数据采集通道搭建
数据采集通道搭建之业务数据采集通道搭建 1.数据同步策略分析 1.1常见的数据同步策略 我们每天都需要从数据库中将业务数据同步到数据仓库当中,对于离线数仓来说,各项指标计算的周期一般为天,因此,我们数 ...
- 95epay支付通道种类:3D通道,实时非3D通道,高级延时非3D通道,高级实
◆|95epay支付通道种类:3D通道,实时非3D通道,高级延时非3D通道,高级实 时非3D通道,高级4S通道.(国内通道最优,商家有保障性) ◆|功能.优势:VISA + MASTERCARD + ...
- 图片一:单通道、三通道、灰度图、黑白图、三通道转灰度图(单通道)
图片的概念经常搞不清楚,导致对图片处理很糟糕.感觉还是总结下比较好,省的每次都要找一堆博客看.下面的内容是博主个人理解,不能保证全部正确,如有错误,敬请指出. 1.图片:通常指的是数字图片,数据结构通 ...
最新文章
- Step By Step(Lua调用C函数)
- 从十个方面提升SharePoint网站性能
- unity json mysql_unity——json总结
- PANEL中显示窗体
- 编译原理—语义分析(Java)
- node 测试生成模拟用户数据
- 河南招教考试计算机专业知识,河南教师招聘考试《计算机网络技术基础》知识点归纳七...
- Magento 创建唯一优惠券 Create unique coupon code in Magento
- 中国企业2017年数据_根据数据,2017年最好的免费在线课程
- 博客系统如何随机插入大量文章数据
- 机器人三定律真有用?但AI可能并不会遵守
- windows环境的python的环境变量_win的环境变量配置(Python实例)
- 快速搭建一个Express工程骨架
- Java自带工具包StringUtils包含方法
- 高等数学——二重积分的计算方法
- 疫情期间大学生在线学习效果调查报告
- html怎么画虚线空心圆,PS怎么画虚线圆圈 一个工具轻松搞定
- 配置华为防火墙接口IP地址和区域
- 1.5 人工智能迅速发展的技术领域
- 2万字 + 50 张图,细说 JVM 内存分布、内存对齐、压缩指针