go语言如何解决高并发计数问题(关于go语言中的协程相关知识点总结)
go语言如何解决高并发计数问题(关于go语言中的协程相关知识点总结)
2024-11-08 03:50:46  作者:不要抱怨  网址:https://m.xinb2b.cn/know/joy265172.html

接上一篇关于go语言中的协程相关知识点总结(一)继续分享 关于go协程之间进行相互通信的机制的知识点,我来为大家科普一下关于go语言如何解决高并发计数问题?以下内容希望对你有帮助!


go语言如何解决高并发计数问题

接上一篇关于go语言中的协程相关知识点总结(一)继续分享 关于go协程之间进行相互通信的机制的知识点

关于Channel(通道)

通道是go提供的一种通信机制,允许协程间进行数据传输,通道是需要指定类型的,是需要使用chan关键字声明的,是可以用close()方法进行关闭通道 的

关于通道的写入与读取

注意看代码里的注释!!!!

package mainimport ("fmt""time")func writeToChan(c chan int,x int) {fmt.Println("写之前",x)//向通道里写数据c<-x close(c)//下面的打印,会在读数据之后执行,如果不读,则一直阻塞了,等1s后,程序结束也不会打印了!fmt.Println("写之后",x)}func main() {c := make(chan int)//向通道里写值go writeToChan(c,10)time.Sleep(1*time.Second)//fmt.Println("读数据",<-c)time.Sleep(1*time.Second) v,ok:=<-c //可以通过ok判读通道是否关闭 if ok{ fmt.Println("通道开着呢") }else{ fmt.Println("通道关闭了") }}

通道作为函数参数传递

在当函数参数时,可以指定通道是只读通道或者是只写通道

//声明f1中能通道c只能是只写通道,并不能从当前通道里读取数据func f1(c chan<- int,x int ) {}//声明f2中能通道c只能是只读通道,并不能从当前通道里写数据func f2(c <-chan int,x int ) {}

来个比较综合点的例子

利用channel(通道)来模拟一下管道!!!

需求:计算所有随机数的和,如果随机数有重复的,则停止计算

package mainimport ("fmt""math/rand""os""strconv""time")//定义一个标志位var closea=falsevar data=make(map[int]bool)//随机数函数func random(min,max int) int {return rand.Intn(max-min) min}//把随机数写入通道func one(min,max int ,out chan<- int){for{//如果为真,则关闭通道if closea{close(out)return}//生成的随机数写入通道中out<-random(min,max)}}//从通道里取值,判断值在不在map中,如果不在加入新的通道中,如果在map中,则关闭one中的通道func two(out chan<- int,in <-chan int) {//从in通道里读取数据,并判断,如果有这个int值存在,则改变标志位,关闭out通道for x := range in {fmt.Println("x",x," ")//判断这个值在不在map中,如果在,则改标志位,如果不在,则添加到这个map中,并把这个值,发送到一个out通道中_,ok :=data[x]if ok{closea=true}else{data[x]=trueout<-x}}fmt.Println()//写完数据关闭通道close(out)}//从通道里取数据,并计算结果func three(in <-chan int) {var sum intfor x2:= range in {sum=sum x2}fmt.Println("随机数的和是",sum)}func main() {args :=os.Argsif len(args)==1{fmt.Println("参数缺失")os.Exit(1)}n1,_:=strconv.Atoi(args[1])n2,_:=strconv.Atoi(args[2])if n1>n2{fmt.Println("最小值与最大值位置不对")return}rand.Seed(time.Now().Unix())//注意在声明的时候,不要声明带方向的通道,要不无法使用a :=make(chan int)b :=make(chan int)go one(n1,n2,a)go two(b,a) //最后这个不协程,主要是为了阻塞主函数完成three(b)}

  • 长沙南站信息(长沙南站)
  • 2024-11-08长沙南站长沙南站,即高铁站,在长沙郊区,离市中心四五十分钟车程的距离,也是不方便,耗时费力又费钱,加之停车场没有明显的指示,使得好多车塞住车站外围,进出要耽搁不少时间……进出玻璃门,上下离乡人,里外望不尽,归。
  • 马兰头怎么炒来吃(春节吃马兰头汤圆)
  • 2024-11-08春节吃马兰头汤圆过年,怎能少得了汤圆不管是菜肉的鲜香,还是豆沙的甜蜜,都被裹进圆圆的汤圆,象征着一年的圆圆满满在浦东本地,菜肉汤圆是很多阿姨妈妈的拿手好戏但大部分的菜肉汤圆,都是用上海青来作为青菜配料,用马兰头代替上。
  • 优雅的父母是怎样培养出来的:三流的父母做保姆
  • 2024-11-08优雅的父母是怎样培养出来的:三流的父母做保姆做父母的都有一颗雄心,一定要好好教育好孩子,都知道父母教育是家庭教育成败的关键,但教育有多种形式,如何才能当好父母,教育好孩子呢?给大家看看这篇文章01、“一流的父母做榜样,二流的父母做教练,三流的父。
  • 鼠灾病毒有多可怕(大鼠灾沈阳开机)
  • 2024-11-08大鼠灾沈阳开机5月20日,林珍钊执导、刘朝晖担任总策划的电影《大鼠灾》在沈阳举行了开机仪式据悉,影片不仅集结了尹昭德、穆萨、夏一瑶、朱娅、姜永波、杨永、吕宇等实力演员,还迎来了饰演过《延禧攻略》中乾隆皇帝世袭亲王的。
  • 股票换手是什么意思(股票换手的意思)
  • 2024-11-08股票换手的意思股票换手是指在中国大陆的证券市场上,换手是用来描述从一个人那里买或卖给另一个人相等份额的期货,即买卖成交证券交易中,仅凭一个价格动态描述市场的信息是非常有限的,成交的数量,也就是换手量是非常重要的参考。
  • 胆囊炎可以取石吗(容易诱发胆囊炎)
  • 2024-11-08容易诱发胆囊炎大家好,我是中医胡治春很多人说胆结石不危险,大不了开刀把石头拿出来就行事实真的这么简单吗?其实结石在胆囊里摩擦碰撞很容易变成结石性胆囊炎,而胆结石是慢性胆囊炎最常见的危险因素之一为什么说它危险呢?因为。
  • 小伙子被逼体验分娩(女子生产遇男麻醉师)
  • 2024-11-08女子生产遇男麻醉师今天这个八卦,看得我乐了一胎的孕妇,经检查可以做无痛分娩了,家属也同意了,结果麻醉医生下来签字,家属发现麻醉医生是男的,死活也不同意倒不是不同意用无痛分娩,是不同意男麻师临时又没有女麻师替换,男家属嚷。
  • 刘翔葛天回应感情(和刘翔闪婚的葛天)
  • 2024-11-08和刘翔闪婚的葛天很多娱乐圈的女星,不管事业多成功,似乎只要碰上了“情”字,就一定会吃很多的苦,也会给自己引来很多的争议虽然也有人能成功从感情中抽身,但因此一直被人诟病的女星也不在少数,比如葛天可能很多人都没有听说过葛。
  • 刘惜君参加超女时多大(刘惜君失声三年)
  • 2024-11-08刘惜君失声三年最近在《天赐的声音》这档节目当中,很多观众都惊喜地发现刘惜君的身影,当时她通过参加选秀比赛出道,以独特的声线吸引了众多的观众,后来她陆陆续续推出了自己的单曲和专辑,销量也是非常不错的但是她的演艺事业发。
  • 宫崎骏的十部经典作品名称(宫崎骏最火的3部作品)
  • 2024-11-08宫崎骏最火的3部作品宫崎骏老爷子的动漫很多都深刻的揭示了人心,还有人类与自然关系,还有儿童天真烂漫的心理,完美充满的将许多人文精神糅合到动漫中去,塑造了一部部拥有灵魂,有血有肉的已经超越动漫界限的人文作品,令世人每看一遍。
  • 高效pdca工作术讲解(史上最详尽PDCA解读)
  • 2024-11-08史上最详尽PDCA解读质量工具的介绍和使用指导的文章很多,但大多数都是用于质量管理与改进实际上质量管理与日常的管理密不可分,质量管理的思路方法同样适用于日常管理本文对PDCA进行了详细解读和阐述,并在将其日常生活中的应用做。