详解go语言 make(chan int, 1) 和 make (chan int) 的区别
遇到golangchannel的一个问题:发现go协程读取channel数据并没有按照预期进行协作执行。
经过查资料:
使用channel操作不当导致,channel分 有缓冲区和 无缓冲区,以下是两者的区别。
无缓冲区channel
用make(chanint)创建的chan,是无缓冲区的,send数据到chan时,在没有协程取出数据的情况下,会阻塞当前协程的运行。ch<-后面的代码就不会再运行,直到channel的数据被接收,当前协程才会继续往下执行。
ch:=make(chanint)//创建无缓冲channel gofunc(){ fmt.Println("timesleep5second...") time.Sleep(5*time.Second) <-ch }() h fmt.Println("即将阻塞...") ch<-1//协程将会阻塞,等待数据被读取 fmt.Println("ch数据被消费,主协程退出")
有缓冲区channel
channel的缓冲区为1,向channel发送第一个数据,主协程不会退出。发送第二个时候,缓冲区已经满了,此时阻塞主协程。
ch:=make(chanint,1)//创建有缓冲channel gofunc(){ fmt.Println("timesleep5second...") time.Sleep(5*time.Second) <-ch }() ch<-1//协程不会阻塞,等待数据被读取 fmt.Println("第二次发送数据到channel,即将阻塞") ch<-1//第二次发送数据到channel,在数据没有被读取之前,因为缓冲区满了,所以会阻塞主协程。 fmt.Println("ch数据被消费,主协程退出")
总结:在创建channel的时候,要注意是否需要缓冲区。有缓冲区时:在不超过缓冲区大小时,不会出现发送方阻塞.无缓冲区时:只要channel数据没有被拿走,始终会阻塞发送方。
以上所述是小编给大家介绍的详解go语言make(chanint,1)和make(chanint)的区别,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。