概论
在Go
语言官网中,是这么定义Channel
这个类型的。
A channel provides a mechanism for [concurrently executing functions] (golang.google.cn/ref/spec#Go…) to communicate by sending and receiving values of a specified element type. The value of an uninitialized channel is
nil
. 通道为并发执行函数提供了一种机制,通过发送和接收指定元素类型的值来进行通信。 未初始化通道的值为 nil。
“不要通过共享内存的方式进行通信,而是应该通过通信的方式共享内存。” 这句话体现了Go
语言对于并发设计的理念,channel
也是实现CSP理论的重要一员。
(资料图片)
基本操作
言归正传,下面我们具体聊聊Channel
。
对于我来说,通道分两种:
无缓冲:无缓冲的在并发编程中,体现在同步。有缓存:有缓冲则体现在异步。有无缓冲的通道的创建相差不多,只是参数的差异
Talk is cheap, show me the code —— Linux创始人Linus
下面我们通过一段简单的代码,来描述通道的创建和操作。
//同步通道 ch1 := make(chan int) //异步通道, 缓冲区大小为1 ch2 := make(chan int, 1) //写数据 ch2 <- 1 //取数据 <- ch2 //关闭一个channel close(ch2)复制代码
把上面我们创建通道,其中包括int
指定通道中可以放如的类型。
要理解通道,我们可以先把他当作一个FIFO的队列。
我们可以把ch2
类比成一个可以放一个元素的队列。
那么ch1
呢? 是能放0个元素的通道? 是的,没错!那么怎么通过ch1
进行协程间通讯呢?
还记得我们在最上面说过,Channel
分两种, 有一种是同步的吗?也就是说,两个协程,要通过 ch1
做通讯,他们必须"握手"。一个协程往ch1
中放数据的时候,必须阻塞等待有另外一个携程过来取,发生握手交换数据。
协程对channel
的读写流程:
遇到过的坑
已经关闭的chan
不能写,可以读对于channel
的遍历最好使用range源码
对Channel
的操作比较简单,下面我们通过Go
的源码,看看的内部是如何实现的。chan
的结构体定义在${GOROOT}/src/runtime/chan.go
中。
type hchan struct { qcount uint // total data in the queue dataqsiz uint // size of the circular queue buf unsafe.Pointer // points to an array of dataqsiz elements elemsize uint16 closed uint32 elemtype *_type // element type sendx uint // send index recvx uint // receive index recvq waitq // list of recv waiters sendq waitq // list of send waiters // lock protects all fields in hchan, as well as several // fields in sudogs blocked on this channel. // // Do not change another G"s status while holding this lock // (in particular, do not ready a G), as this can deadlock // with stack shrinking. lock mutex } 复制代码
qcount
— Channel 中的元素个数;dataqsiz
— Channel 中的循环队列的长度;buf
— Channel 的缓冲区数据指针;sendx
— Channel 的发送操作处理到的位置;recvx
— Channel 的接收操作处理到的位置;通过上面的结构体,我么可以抽象出下面一幅图:
小结
channel
是并发控制中的新成员,虽然他内部也有锁,但是对于我们来说他是无感的,在官方网络库中,Go
使用很多通道来做并发控制。
作者:OpenStack链接:https://juejin.cn/post/7010772020459733005来源:稀土掘金著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
关键词:
-
[Golang]Go的channel
“不要通过共享内存的方式进行通信,而是应该通过通信的方式共享内存。”这句话体现了Go语言对于并发设计的理念,channel也是实现CSP理论的重
-
完善城镇住房保障体系 让群众安居更安心
住房是人的一种基本权利,从古至今人们无不牵挂住房问题。党的二十大报告提出“加快建立多主体供给、多渠道保障、租购并举的住房制度”。近年
-
2022年三门峡市市场主体增长率居全省第四位
“某物业公司被举报有在电费、水费中加收其他费用的行为。经立案调查并委托第三方机构专项审计,确认当事人在2021年1月至2022年2月间多收电费
-
木地板怎么铺更坚固?木地板铺设方式优缺点!
木地板铺设定要注意铺装方法……木地板自然感强,脚感舒适,是现在家庭装修首选的地面装饰材料。不过利用木地板进行地面装饰的时候,一定要注
-
时代电气(688187)3月16日主力资金净卖出2586.28万元_世界今热点
截至2023年3月16日收盘,时代电气(688187)报收于50 5元,下跌6 31%,换手率2 9%,成交量6 3万手,成交额3 27亿元。
-
福州华侨中学中考录取分数线_福州华侨中学分数线-世界聚焦
1、正常缴费生第一志愿录取分数线为377分,第二志愿录取分数线为383分,第三志愿录取分数线是387分;择校生第一志愿录
-
【世界热闻】周杰伦一年不工作_周杰伦不工作收入过亿
1、周杰伦自从出道后就迅速火遍亚洲,有不少人都是听着他的歌长大的。2、可以说,周杰伦是一代甚至两代人的记忆。3、并且,由
-
众生药业:控股子公司开展治疗成人单纯性甲型流感的药物ZSP1273片Ⅲ期临床研究完成全部病例数入组
众生药业3月16日公告,控股子公司众生睿创组织开展的用于治疗成人单纯性甲型流感的一类创新药物ZSP1273片Ⅲ期临床研究
-
警方12小时快侦快破盗窃团伙终被抓获
本报讯(通讯员罗晓虹)近日,勐腊县公安局城镇派出所(南)精心部署、紧密安排、快速出击,仅用12小时成功破获一起盗窃案,抓获两名盗窃嫌疑
-
盗墓同人-all邪中短文集 世界动态
1、《盗墓同人-all邪中短文集》是二黑创作的网络小说。2、发表于晋江文学网。
-
国家经济发展趋势_热闻
中国经济,它正在从高速度增长不断转向高质量发展,新旧动能不断接续转换,短期经济运行可能出现阶段性波动和不稳定,但在整个发
-
【当前热闻】什么是高血压病的概念(什么是高血压)
什么是高血压病的概念,什么是高血压这个很多人还不知道,现在让我们一起来看看吧!1、应用降压药物治疗原发性高血压需长期服药。2、因此,宜选
-
聚焦:表层巩膜炎是很严重的病吗_巩膜炎是很严重的病吗
1、硬化症是一种严重的疾病。2、这种病是免疫系统疾病,可以复发。3、巩膜炎严重时可扩散至邻近组织,引起继发性角膜炎、继发
-
央视 315 晚会后续:iQOO手机发布彻底清除手机数据教程 全球热点
IT之家3月16日消息,在昨晚的315晚会上,央视揭秘:手机就算恢复出厂设置也不一定能彻底清除手机数据。报道称,电子产品迭代升级速度越来越快
-
电动车国标标准(电动车国标)-焦点关注
电动车国标标准,电动车国标很多人还不知道,现在让我们一起来看看吧!1 2019年4月15日,《电动自行车安全技术规范》(新国标)正式实施,规定电
-
环球关注:山水水泥(00691)去年溢利同比下降73%至7.49亿元人民币 派末期息每股0.07元
山水水泥(00691)发布截至2022年12月31日止年度业绩,录得归属于公司权益持有人的利润7 49亿元(人民币,下同),同比下降73%;基本每股盈利0 17
-
无糖食品界大地震,赤藓糖醇翻车了?
每一个减脂人对赤藓糖醇都不陌生吧,作为代糖界的扛把子,不仅广泛用于无糖饮料里,在面包、蛋糕和各种主打健康0糖的小零食中,都少不了赤藓糖
-
【播资讯】越秀地产2022年核心净利润42.4亿元 同比上升2.1%
3月15日,越秀地产发布2022年全年业绩公告。公告显示,2022年全年越秀地产实现营业收入约为724 2亿元,同比上升26 2%;毛利约为148 1亿元,同
-
全球观焦点:工程师英语单词_工程师英语
1、全国职称英语考试一般在上一年的11月份报考,本年度4月份考试,8月份左右出成绩,11月份凭成绩单申报职称。2、你可以
-
湖南中医药高等专科学校“杏林耕读园”劳动基地启动 热门看点
湖南中医药高等专科学校“杏林耕读园”劳动基地启动