go语言 make(chan int, 1) 和 make (chan int) 的区别

栏目: IT技术 · 发布时间: 4年前

内容简介:经过查资料:使用channel 操作不当导致,channel分用make(chan int) 创建的chan, 是无缓冲区的, send 数据到chan 时,在没有协程取出数据的情况下, 会阻塞当前协程的运行。ch <- 后面的代码就不会再运行,直到channel 的数据被接收,当前协程才会继续往下执行。

遇到golang channel 的一个问题:发现 go 协程读取channel 数据 并没有按照预期进行协作执行。

经过查资料:

使用channel 操作不当导致,channel分 有缓冲区无缓冲区 , 以下是两者的区别。

无缓冲区channel

用make(chan int) 创建的chan, 是无缓冲区的, send 数据到chan 时,在没有协程取出数据的情况下, 会阻塞当前协程的运行。ch <- 后面的代码就不会再运行,直到channel 的数据被接收,当前协程才会继续往下执行。

ch := make(chan int)  // 创建无缓冲channel

go func() {
    fmt.Println("time sleep 5 second...")
    time.Sleep(5 * time.Second)
    <-ch
}()
h
fmt.Println("即将阻塞...")
ch <-1   // 协程将会阻塞,等待数据被读取
fmt.Println("ch 数据被消费,主协程退出")

有缓冲区channel

channel 的缓冲区为1,向channel 发送第一个数据,主协程不会退出。发送第二个时候,缓冲区已经满了, 此时阻塞主协程。

ch := make(chan int, 1)  // 创建有缓冲channel

go func() {
    fmt.Println("time sleep 5 second...")
    time.Sleep(5 * time.Second)
    <-ch
}()

ch <-1   // 协程不会阻塞,等待数据被读取

fmt.Println("第二次发送数据到channel, 即将阻塞")
ch <-1   // 第二次发送数据到channel, 在数据没有被读取之前,因为缓冲区满了, 所以会阻塞主协程。

fmt.Println("ch 数据被消费,主协程退出")

总结: 在创建channel的时候, 要注意是否需要缓冲区。有缓冲区时:在不超过缓冲区大小时,不会出现 发送方阻塞. 无缓冲区时: 只要channel 数据没有被拿走,始终会阻塞发送方。

感谢这位大神的文章: https://studygolang.com/artic...


以上所述就是小编给大家介绍的《go语言 make(chan int, 1) 和 make (chan int) 的区别》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

图解HTTP

图解HTTP

【日】上野宣 / 于均良 / 人民邮电出版社 / 2014-4-15 / 49.00元

本书对互联网基盘——HTTP协议进行了全面系统的介绍。作者由HTTP协议的发展历史娓娓道来,严谨细致地剖析了HTTP协议的结构,列举诸多常见通信场景及实战案例,最后延伸到Web安全、最新技术动向等方面。本书的特色为在讲解的同时,辅以大量生动形象的通信图例,更好地帮助读者深刻理解HTTP通信过程中客户端与服务器之间的交互情况。读者可通过本书快速了解并掌握HTTP协议的基础,前端工程师分析抓包数据,后......一起来看看 《图解HTTP》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

html转js在线工具
html转js在线工具

html转js在线工具