当前位置: 首页>资讯 >

[Golang]Go的channel|全球新视野

来源: 腾讯云 | 时间: 2023-03-14 17:14:27 |

概论

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理论的重

2023-03-14

天天头条:消费者权益保护需关注九大问题

2022年市消保委通过梳理投诉和相关消费调查发现:消费者权益保护需关注九大问题2022年,市消保委共受理消费者投诉32万余件,通过投诉梳理和相

2023-03-14

信用贷款利率 信用贷款的利率是多少2021 世界短讯

一般来说,信用贷款是短期的,最长的不超过三年,所以银行信用贷款的利率是根据此时间点规定的,银行信用贷款的利率如下:1、工商银行6个月利

2023-03-14

环球热点评!草上飞的青梅竹马不可能被特别周告白(诚哥线2)

“铃鹿?!“我有些慌张地站起来,在周围几个老师惊讶的目光中,拉着无声铃鹿走出了办公室,“发生什么事了?”“哈?!当然是……”无声铃鹿

2023-03-14

国信期货:国际贸易量偏紧 郑糖易涨难跌-微动态

一、行情回顾2月郑糖震荡走强。春节过后,郑糖跳空高开,后期走势确认跳空缺口,维持强势。基本面上,国产糖估产上调,最终产量减幅或低于预期

2023-03-14

看的最远的地方歌词(看的最远的地方完整歌词)

看的最远的地方歌词,看的最远的地方完整歌词很多人还不知道,现在让我们一起来看看吧!解答:1、你是第一个找到我的人。2、越是面无表情,越

2023-03-14

纽约联储称:2月全年预期通胀率为4.2%|观焦点

3月13日电,纽约联储称,2月全年预期通胀率为4 2%,而1月为5%;2月对未来三年的通胀预期稳定在2 7%;2月对未来

2023-03-13

全球快播:1岁以后宝宝的运动与锻炼

0-2岁是宝宝大运动发展的重要时期,尤其是进入1岁以后,宝宝运动能力发展得越来越快,因此训练也必不可少。大肌肉重庆安琪儿妇产医院儿保科副

2023-03-13

ted魔兽优酷空间自频道(2009优酷空间)

1、点击进入优酷视频应用。2、点击界面右上角的三条水平线。3、在菜单列表中,选择设置。4、在设置列表中,选择下载设置。5

2023-03-13

焦点热门:我国开放出境团队游目的地国家60个 越南如愿列入中国出境团队游目的地(今日/头条)

一、我国开放出境团队游目的地国家60个参考文章:https: www toutiao com article 7209

2023-03-13

米聊号靓号-米聊号

1、今天,我将教你如何在电脑上注册一个米聊账号。先下载一个米聊电脑客户端。安装后,如下图所示,双击快捷图标。2、点击注册进入注册页面。

2023-03-13

长卷|中华民族一家亲 携手奋进新征程

监制:李忠发策划:刘洁统筹:郑卫、兰红光、张维革摄影:兰红光、邢广利、张豪夫视觉:陈为、刘茜编辑:邓坚、曲振东、施鳗珂、

2023-03-13

冷空气“到货”,本周天气怎么变?广雅披露今年招生计划|早安,荔湾_快资讯

冷空气“到货”,本周天气怎么变?广雅披露今年招生计划|早安,荔湾

2023-03-13

机油更换周期如何确定(机油更换周期)

1、汽车机油更换周期,一般在在新车说明书上都规定了的,这个周期是机油的最长更换周期,关于全合成机油更换周期,每5000公里~10000公里换一

2023-03-13

世界新消息丨刘雯个人资料学历_刘雯个人资料

1、刘雯,1988年1月27日出生于湖南永州,中国模特。2、2009年,作为第一位亚洲模特,她出现在维多利亚的秘密内衣秀

2023-03-12

全球观天下!a4l后视镜自动折叠方法是什么

汽车现在已经越来越普及,基本上都快实现每家每户都有汽车了,那么汽车这么多的情况之下,我们在用车的过程当中肯定也就会遇到各

2023-03-12

repetitive strain_repetitive

1、repetitive[英][rɪˈpetətɪv][美][rɪˈpɛtɪtɪv]adj 重复的,啰嗦的;复唱的;

2023-03-12

要看我想不想赢!马刺落后15分连赢三节掀翻西部第一

要看我想不想赢!马刺落后15分连赢三节掀翻西部第一,马刺队,约基奇,约翰逊,科林斯,丹佛掘金队

2023-03-12

天天简讯:广东食品药品职业学院宿舍床多大_广东食品药品职业学院宿舍

1、师妹是住新楼。2、有2个厕所。3、一个宿舍12个人2-3把吊扇星期一到星期四个星期日10 30准时没电星期五

2023-03-12

全球速递!初中英语老师要求英语过几级(英语教师资格证报考条件)

1、报考小学英语教师资格证需要具备以下的要求:1 学科知识中学教师资格证在考试的科目上,比小学教师资格证的考试多出了《学科知识与教学能力

2023-03-11

资讯

[Golang]Go的channel|全球新视野

“不要通过共享内存的方式进行通信,而是应该通过通信的方式共享内存。”这句话体现了Go语言对于并发设计的理念,channel也是实现CSP理论的重

2023-03-14     
天天头条:消费者权益保护需关注九大问题

2022年市消保委通过梳理投诉和相关消费调查发现:消费者权益保护需关注九大问题2022年,市消保委共受理消费者投诉32万余件,通过投诉梳理和相

2023-03-14     
信用贷款利率 信用贷款的利率是多少2021 世界短讯

一般来说,信用贷款是短期的,最长的不超过三年,所以银行信用贷款的利率是根据此时间点规定的,银行信用贷款的利率如下:1、工商银行6个月利

2023-03-14     
环球热点评!草上飞的青梅竹马不可能被特别周告白(诚哥线2)

“铃鹿?!“我有些慌张地站起来,在周围几个老师惊讶的目光中,拉着无声铃鹿走出了办公室,“发生什么事了?”“哈?!当然是……”无声铃鹿

2023-03-14     
国信期货:国际贸易量偏紧 郑糖易涨难跌-微动态

一、行情回顾2月郑糖震荡走强。春节过后,郑糖跳空高开,后期走势确认跳空缺口,维持强势。基本面上,国产糖估产上调,最终产量减幅或低于预期

2023-03-14     
看的最远的地方歌词(看的最远的地方完整歌词)

看的最远的地方歌词,看的最远的地方完整歌词很多人还不知道,现在让我们一起来看看吧!解答:1、你是第一个找到我的人。2、越是面无表情,越

2023-03-14