世界快讯:[Golang]Go的channel
“不要通过共享内存的方式进行通信,而是应该...
在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来源:稀土掘金著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
关键词:
彩虹喷泉、火山喷发、浓烟瀑布……为了吸引家长购买,部分商家将化学实验搬到了孩子们的玩耍场景中。近日,北京商报记者调查发现,电商平台
北京商报 2022-07-08一季度家电行情双线下滑、疫情面扩大消费受到影响、工商业生产和供应链受到影响,这三个因素或对618电商大促产生重要的影响。今年3月以来,
蓝科技 2022-05-20深陷亏损中的生猪行业,笑到最后的选手或不仅有家底,更要会审时度势。4月生猪价格上涨后,头部上市猪企的销售收入随即上涨。不过,不少上
中国商报网 2022-05-205月17日,人民币对美元汇率迎来久违的大涨。人民币对美元即期汇率当日收盘报6 7472,较上一交易日涨495个基点,创出了一年多的最大升值幅度
深圳商报 2022-05-20国家统计局近日发布的数据显示,今年1—4月餐饮收入13262亿元,同比下降5 1%;其中4月餐饮收入2609亿元,同比下降22 7%。值得关注的是,近几
中国商报网 2022-05-20今年以来,广西各级农业农村部门提早谋划、主动作为,积极抓好农业生产。据农情统计,全区春种粮食作物面积已超过全年任务的一半,超额完成
农民日报 2022-05-20源飞宠物IPO近日过会,拟登陆深交所主板,成为宠物牵引用具第一股。 资料显示,源飞宠物主营宠物用品和宠物零食的研发、生产和销售,主要
深圳商报 2022-05-20彩虹喷泉、火山喷发、浓烟瀑布……为了吸引家长购买,部分商家将化学实验搬到了孩子们的玩耍场景中。近日,北京商报记者调查发现,电商平台
北京商报 2022-07-08一季度家电行情双线下滑、疫情面扩大消费受到影响、工商业生产和供应链受到影响,这三个因素或对618电商大促产生重要的影响。今年3月以来,
蓝科技 2022-05-20深陷亏损中的生猪行业,笑到最后的选手或不仅有家底,更要会审时度势。4月生猪价格上涨后,头部上市猪企的销售收入随即上涨。不过,不少上
中国商报网 2022-05-205月17日,人民币对美元汇率迎来久违的大涨。人民币对美元即期汇率当日收盘报6 7472,较上一交易日涨495个基点,创出了一年多的最大升值幅度
深圳商报 2022-05-20国家统计局近日发布的数据显示,今年1—4月餐饮收入13262亿元,同比下降5 1%;其中4月餐饮收入2609亿元,同比下降22 7%。值得关注的是,近几
中国商报网 2022-05-20今年以来,广西各级农业农村部门提早谋划、主动作为,积极抓好农业生产。据农情统计,全区春种粮食作物面积已超过全年任务的一半,超额完成
农民日报 2022-05-20源飞宠物IPO近日过会,拟登陆深交所主板,成为宠物牵引用具第一股。 资料显示,源飞宠物主营宠物用品和宠物零食的研发、生产和销售,主要
深圳商报 2022-05-20“不要通过共享内存的方式进行通信,而是应该...
1、主要学习:新能源汽车构造、电工电子技术、...
1、欧洲债务危机即欧洲主权的债务危机。2、欧...
挖贝网3月14日,小满云仓(873511)发公告称,...
一、倒怎么组词的近义词1、正[zhèng]2、立[l...
山西长子“羊倌”养羊20余年 带动700余户养殖户发“羊财”
上海首个“两山”实践创新基地成功创建
广西医科大一附院向越南捐赠医疗防疫物资
黄埔海关破获案值5.5亿元走私进口二手挖掘机案
黄河内蒙古段今年首次出现流凌
Copyright 2015-2022 西方仓储网版权所有 备案号:沪ICP备2020036824号-7 联系邮箱:5 626 629 @qq.com