[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来源:稀土掘金著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
关键词:
上一篇:【天天新视野】3月14日昨日连板_含一字板块涨幅达7%
下一篇:最后一页
- [Golang]Go的channel 微头条
- 【天天新视野】3月14日昨日连板_含一字板块涨幅达7%
- 甲流抗原试剂热销,部分经销商手中已经没有现货
- 天天热推荐:脾脏疼痛是什么原因_脾脏疼痛是什么原因导致
- 天天新消息丨风范股份:3月13日融资买入599.42万元,融资融券余额2.1亿元
- 网友在饭店拍到一位老板娘肤白貌美,网友:多喝了几十瓶啤酒 微资讯
- 【天天速看料】98分莫德里奇领衔周精选 托里斯为毕业中卫
- 【世界聚看点】传递民生温度 彰显开放自信——全国两会“三大通道”聚焦
- 围裙简笔画图片_围裙简笔画 全球今头条
- 城建局全称是_城建局全称_全球报道
-
34+8+4,三节打卡5连胜!和他竞争MVP,你还差点
34+8+4,三节打卡5连胜!和他竞争MVP,你还差点,哈登,奇才,恩比德,约基奇,mvp,76人队
-
粤推出“认种一棵树”义务植树小程序
南方日报讯3月12日,广东省林业局组织百名机关干部开展义务植树活动,以实际行动为绿美广东生态建设再添新绿。省林业局数据显
-
明星写真:李斯羽抹胸包臀裙性感美拍,黑丝高跟鞋美腿性感妩媚|当前独家
老话说得好:“红花还需绿叶衬,人靠衣装马靠鞍”。即使自身容貌和身材俱佳的女人,也需要找寻属于自己风格的服饰穿搭。平时看似普通的女人,
-
国羽1冠1亚收官!冯彦哲黄东萍17连胜夺第3冠,李诗沣遭逆转丢冠
国羽1冠1亚!冯彦哲特鲁姆普17连胜第三次夺冠,李诗沣被逆转丢掉冠军。单打决赛,国羽的冯彦哲 特鲁普和李诗沣先后出战。其中,凤凰组合2-0横
-
熵基科技:在新加坡投资设立 ZKDIGIMAX PTE.LTD. 公司
每经AI快讯,熵基科技(SZ301330,收盘价:43 64元)3月12日晚间发布公告称,根据熵基科技股份有限公司战略规划及业务发展需要,公司通过新加
-
【环球速看料】甲巯咪唑的作用与功效_甲硫咪唑的作用
1、噻咪唑,又名塔巴内酯,是一种甲状腺抑制剂,适用于甲亢。2、起效快,代谢慢,持续时间长。3、噻咪唑主要用于轻中度甲状腺
-
1-0!丁俊晖决赛开门红,单杆72分制胜,塔猜亚低级失误送大礼! 焦点热闻
3月11日,斯诺克6红球世锦赛决赛开杆,丁俊晖对阵塔猜亚争冠。首局泰国一哥率先进攻受阻,留下红球停袋口的低级失误,丁俊晖上手后直接单杆清
-
世界快资讯丨脱羧反应机理图解_脱羧反应
1、要明确答案到底是什么,首先要弄清这个反应的机理:CH3|COONa(s)+NaO|H(s)==Na2CO3(s)+CH4(g)可见,这
-
与全世界Z世代共鸣,新缤智高价值不设限
如果真如电视剧所演的那般,三体人终有一天会降临地球,你会有怎样的选择?或许大多数年轻人的选择是:我会躺平。在物质充足,有家人宠爱的环
-
每日热文:安徽省人民政府关于进一步做好相对集中行政处罚权工作的若干意见
1、安徽省人民政府于2010年3月24日发布的皖政[2010]22号文件。本文到此分享完毕,希望对大家有所帮助。
X 关闭
北京试点全龄友好住宅项目 老年家庭购房首付最低35%
西安新增本土确诊病例150例 详情发布
广东最低气温跌至-6℃现冰挂 部分道路及海上交通受影响
“2022科学跨年系列活动”启动 提高公众对科学类流言“免疫力”
珠科院多举措助力大湾区抗旱防咸保供水
X 关闭
得知西安疫情防控“升级” 男子夜骑共享单车回咸阳淳化
中国医生将任SIU主席背后:从追随者同行者到引领者
海南省通报政法队伍教育整顿成果
云南两地发现核酸阳性人员 西安实行最严格的社会面管控
广东梅州大埔中央红色交通线沿线发现多株百岁古树