范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

golang的两把利器,协程和管道

  golang的协程相信大家都不陌生,在golang中的使用也很简单,只要加上一个关键字go即可,虽然说大家都知道,但是真的在实际使用中又遇到这样那样的问题,坑其实还是挺多的。而网上很多文章和教程,要么就是讲的太简单,给你简单介绍一下协程和管道的使用,点到为止,要么就上来给你撸GPM模型,看的人一脸懵逼,所以我以实际使用过程中遇到的问题这个角度出发,可能会分多篇总结一下golang的协程相关的知识点,希望对你有用,如果觉得还不错,记得点个赞,点个关注。ps:如果你从来没有了解过golang的协程,建议先自己搜一些资料简单的了解一下,还有并发并行那些基础概念之类的,本文都不会提及。协程非常容易引发并发问题
  我们先看下列程序func main() { 	res := make(map[int]int) 	for i := 0; i < 100; i++ { 		go handleMap(res) 	} 	time.Sleep(time.Second * 1)  } func handleMap(res map[int]int) { 	for i := 0; i < 200; i++ { 		res[i] = i * i 	} } 复制代码因为map类型作为参数是直接以引用的方式传递的,所以handleMap函数不需要返回值,直接操作参数res即可handleMap的作用就是不断的给map赋值因为执行handleMap的时候是开启协程的,所以是多个程序并发的去对res(map类型写入),所以上述程序是会报错的,输出结果如下程序下方加上time.Sleep(time.Second * 1)的原因是因为主程序(main)执行完毕退出,但是协程还没执行完毕会被直接关闭。fatal error: concurrent map writes  goroutine 48 [running]: runtime.throw(0x100f814d1, 0x15)         /opt/homebrew/Cellar/go@1.16/1.16.13/libexec/src/runtime/panic.go:1117 +0x54 fp=0x14000145f50 sp=0x14000145f20 pc=0x100f16f34 runtime.mapassign_fast64(0x100faeae0, 0x14000106180, 0x1f, 0x14000072200)         /opt/homebrew/Cellar/go@1.16/1.16.13/libexec/src/runtime/map_fast64.go:176 +0x2f8 fp=0x14000145f90 sp=0x14000145f50 pc=0x100ef7188 main.handleMap(0x14000106180)         /Users/test/Sites/beikego/test/rountine.go:22 +0x44 fp=0x14000145fd0 sp=0x14000145f90 pc=0x100f7e644 runtime.goexit()  复制代码解决方式(1) 加锁
  如果有并发问题,我们最容易想到的一个办法就是加锁func main() { 	res := make(map[int]int) 	for i := 0; i < 100000; i++ { 		go handleMap(res) 	}  	time.Sleep(time.Second * 1) 	lock.Lock()  //因为对map的读取的时候有可能还在写入,所以这里也需要加锁 	for _, item := range res { 		fmt.Println(item) 	} 	lock.Unlock() } func handleMap(res map[int]int) { 	lock.Lock()  //每一个协程过来请求都先加锁 	for i := 0; i < 2000; i++ { 		res[i] = i * i 	} 	lock.Unlock()  //处理完map之后释放锁 }  复制代码
  上面过程我画了一张图,具体哪里为什么加锁都有说明
  上述例子虽然开启了100000个协程,但是在每个协程处理map的时候加上了一个lock,处理完毕才释放,所以各个协程对map的操作是隔离开的。在读取map的时候加锁的原因,是因为sleep 1s之后,有可能map还在写入,边读边写当然会有并发问题 上述方式虽然解决了并发问题,但是也存在一定的问题。主要是需要sleep,而且sleep多长时间没法确定 所以这里引入咱们的解决方式2,管道解决方式(2)管道channel
  channel本质就是一个数据结构,队列。既然是队列,当然有着先进先出的原则,而且是能保证线程安全的,多个gorountine访问不需要加锁。
  当然如果你还没有接触过管道,可以提前找些资料了解一下,下面是一个管道的简单示意图
  管道在使用的过程中需要注意的问题
  管道(channel)在使用的过程中有很多需要注意的点,我在这里列一下使用管道之前必须make一下,而且指定长度  var intChan chan int 	intChan <- 1 	fmt.Println(<-intChan)   //返回信息   fatal error: all goroutines are asleep - deadlock!   goroutine 1 [chan send (nil chan)]: 复制代码
  为什么需要make,指定长度也很好理解, 管道的本质是队列 ,队列当然是需要指定长度的 管道写入的数据数如果超过管道长度,会报错  intChan := make(chan int, 1)  //长度为1 	intChan <- 1 	intChan <- 2  //这里会报错 	fmt.Println(<-intChan)   //返回结果   fatal error: all goroutines are asleep - deadlock!   goroutine 1 [chan send]: 复制代码读取空管道,会报错intChan := make(chan int, 1) fmt.Println(<-intChan)  //此时管道里面还没有任何内容 //返回结果 fatal error: all goroutines are asleep - deadlock! goroutine 1 [chan receive]: 复制代码管道也支持interface,但是拿到结构体具体的属性的时候,需要断言type Person struct { 	Name string } func main(){     personChan := make(chan interface{}, 10) 	  personChan <- Person{Name: "小饭"}  //写入结构体类型 	  personChan <- 1  //写入int类型 	  personChan <- "test_string"  //写入string类型 	  fmt.Println(<-personChan, <-personChan, <-personChan) }   //返回结果   {小饭} 1 test_string 复制代码
  上面例子我们可以看到,如果管道定义为interface类型,任何类型的数据都是可以写入并且正常取出的,但是我们写入结构体类型之后,如果想取出结构体的具体属性,则需要断言type Person struct { 	Name string } func main() { 	personChan := make(chan interface{}, 10) 	personChan <- Person{Name: "小饭"} 	person := <-personChan  //取出结构体之后,此时还不知道是什么类型,所以没法直接取属性,因为定义的是interface 	per := person.(Person)  //对取出结果进行断言 	fmt.Println(per.Name) } //返回结果 小饭 复制代码管道是可以循环的,但是循环之前必须关闭,关闭之后不可写入任何数据  personChan := make(chan int, 10) 	personChan <- 1 	personChan <- 2 	personChan <- 3 	close(personChan) //关闭之后管道不能写入任何数据,否则就会报 panic: send on closed channel 	for item := range personChan {  //在for range循环管道之前必须关闭管道,否则会报  fatal error: all goroutines are asleep - deadlock! 		fmt.Println(item) 	} 复制代码其实为什么循环之前需要关闭管道,很好理解,因为for rang循环可以简单理解为一个死循环,当管道数据读取完了之后会继续读取,类似于读取一个空管道,当然会报错管道关闭之后不能写入更好理解,一个对象销毁了还能去赋值么?一样的道理切忌不要尝试用for(i:=0;i
伊利携手合作伙伴创佳绩一超多强格局继续强化历时近1个月,30余场盛会!日前,伊利集团热爱聚星辰,同心跨山海2023年客户大会圆满收官。大会上,伊利全球合作伙伴齐聚一堂,共同回顾了硕果累累的2022年,共同开启了更加美好的2福永州丨江永金风玉露相逢胜却人间无数视频加载中所有的相遇,都是久别重逢。临近双节,到江永来一场说走就走的旅游,放松一下紧张的心情吧。漫步女书岛感受千古之谜女书和独特的女书习俗,让你仿佛踏入了女儿国,再和好姐妹来一场结三支箭开弓满月,多少房企有钱了?作者丨张敏,胡暄悦编辑丨张伟贤图源丨视觉中国经历了一年多流动性危机的房地产,终于在2022年末迎来真正的活水。2022年11月,监管部门先后向房地产业射出三支箭,即分别在银行信贷债43年只为做好一条火腿要做好火腿,天气必须选在寒冷的立冬之后。赵增说,自己制腿,严格遵循古法,一把盐,三把刀,一条冬腿,一如千百年来老师傅们做的那样。从赵增年轻时在火腿厂卖力气,到后来刻苦钻研成为火腿专少年歌行好评如潮,动漫版翻拍的又一成功大制作,你们饭了没最近武侠剧频繁更新,要说最火爆的怕就是由动漫到真人版的少年歌行了吧!直到昨晚,总共也才更新到了第9集,然而评论区的画风却是清一色的盛赞!比如下图有夸导演选角厉害的,也有说从特效演员短视频虽短,著作权保护不短文法人杂志全媒体记者李辽如今,短视频因其短小精悍的特征已成为网络信息传播主流形式之一。2022年8月31日,中国互联网络信息中心发布的第50次中国互联网络发展状况统计报告显示,截至少年歌行萧瑟海外寻仙将遭遇怎样的波折?能否顺利回到天启?编辑七酉光明德十六年,永安王萧楚河坚信琅玡王萧若风并未谋逆,于御前痛陈十三条疑点,言辞恳切,声音激昂,竟有老臣在朝堂上落下泪来。然而却引来明德帝震怒,将贬为庶民,流放青州,无召不得过年请一定要这样穿红色外套半身裙,既洋气喜庆,又时髦高级过年穿红色已经是约定俗成的事情了,如此有氛围感的红色外套,在冬季怎么都少不了的。也有人拒绝穿红色,觉得为了过年特意选一款红色的衣服,年后就不能穿了,这种往往是因为自己没有选对颜色和2022年呼吸科领域万篇论文大数据分析40本投稿期刊研究热点等根据pubmed检索,2000年以来,呼吸科(关键词PulmonologyorRespiratory)领域相关研究共发表754,611篇(统计时间20221228),从2016年起数读2022年12月小鹏汽车重回万辆交付,全年销量超12万辆文懂车帝原创邢秋鸿懂车帝原创行业2023年1月1日,小鹏汽车发布交付数据显示,2022年12月总交付11292辆,环比增长94。其中,G9首次突破4000辆,达4020辆,环比增长印尼禁铝面临许多挑战今年以来,印尼政府高层频频提及矿产出口禁令问题,印尼禁铝早已是山雨欲来风满楼。尽管如此,印尼禁铝仍面临新建铝土矿冶炼厂进展不顺利融资难等许多现实挑战。印尼发展矿产下游产业不能仅靠出
专家热议二十大报告中国未来五年最权威的政策蓝图据彭博新闻社网站10月16日报道,习近平刚刚在中共二十大上阐述了中国未来五年最权威的政策蓝图。10月16日,中国共产党第二十次全国代表大会在北京人民大会堂开幕。这是代表抵达会场。(超1。3万亿斤,彰显中国饭碗分量数评新时代中国经济历史性跃升来源经济日报党的二十大报告作出全方位夯实粮食安全根基的战略安排,要求牢牢守住18亿亩耕地红线,确保中国人的饭碗牢牢端在自己手中。全方位牢牢确保这些词汇语重心长,无不透露出党中央对粮部分私募机构出手以自有资金申购旗下产品中证网讯(记者昝秀丽王宇露)近期市场行情有所波动,市场整体估值处于较低水平。部分私募机构出手以自有资金申购旗下产品,且投资转向积极。据不完全统计,自9月份以来,近千家私募机构及其员贴息贷款加码医疗新基建,对器械企业拉动效应何时显现?21世纪经济报道记者唐唯珂实习生唐菁阳广州报道近期医药板块迎来了久违的拉升,其中器械股表现颇为亮眼。10月18日,医疗器械概念股直线拉升,微电生理3连板,宏达高科南天信息等多股涨停板凳会上谈心得,激情澎湃话未来10月18日星期二晴今天,沙洲村民俗广场开展了一场别开生面的板凳会,沙洲村三支队伍及村民搬着板凳围坐在一起,由沙洲村第一书记乡村振兴工作队队长谭诗华主持此次特别会议。会上,每个发言华夏银行定增历时一年终落地,募集资金仅为计划四成中新经纬10月19日电(魏薇)近日,华夏银行官宣完成新一轮定增,从结果来看,募集金额仅为计划的四成。19日,华夏银行发布非公开发行A股股票发行结果暨股份变动公告(下称公告)。公告称专访渣打银行欧洲经济学家ChristopherGraham欧洲经济具有高度不确定性,央行将继续加息以遏通胀21世纪经济报道记者何柳颖报道近日,瑞士信贷银行连续遭受投资亏损的消息不仅将该银行置于旋涡之中,也使外界对欧洲经济的担忧升温。2022年,俄乌冲突的发生使还在疫情冲击中艰难起身的欧深秋晨雾浓深秋晨雾浓作者书玫厚重的浓雾浸泡着古同官的深秋,清晨,我从沉醉的梦中醒来,推窗外瞧,天空被浓浓的雾气所笼罩着,就连院子里的核桃树都是朦朦胧胧的,这雾也是迷人,让人有种腾云驾雾的感觉欧洲专家亲历中国十年环保成就蓝天回来了导读过去十年,中国在生态环境保护方面取得了显著进展空气污染显著降低,城市更加美丽,受污染的水体基本消失,森林覆盖率稳步提高,生态系统得到了有效保护,民众环保意识也大大增强。然而,当二十大老外看中国丨俄罗斯小姐姐中国人的守望相助让人感到温暖编者按当今中国,发展成就令世界瞩目。中国作为世界第二大经济体,正在日益走近世界舞台的中央,长期在中国生活的外国友人们,不仅看到了中国的飞速巨变,更在耳濡目染中,读懂了中国可持续发展基金持仓线路图浮现持股偏重消费新能源和半导体等领域21世纪经济报道记者叶麦穗广州报道上市公司三季报和基金三季报同步披露,基金经理的持仓路线路也逐步浮现。根据已经披露的信息来看,截至10月18日,公募基金合计持有60只股票,合计市值