找回密码
 会员注册
查看: 17|回复: 0

为什么这段代码会阻塞?

[复制链接]

3

主题

0

回帖

10

积分

新手上路

积分
10
发表于 2024-10-9 21:06:48 | 显示全部楼层 |阅读模式
为什么这段代码会阻塞? 马健尧 腾讯云开发者 腾讯云开发者 腾讯云计算(北京)有限责任公司 腾讯云官方社区公众号,汇聚技术开发者群体,分享技术干货,打造技术影响力交流社区。 886篇内容 2024年09月10日 08:45 北京 目录1 故事开始的地方——这段代码为什么会阻塞?2 三个问题3 channel4 加餐腾讯内网上,一位提问者对一段代码为什么会阻塞发出了疑问,该问题讨论跨度约一周,探讨过程中,出现了许多由于不够理解 channel 而产生的问题,非常经典。本文结合内网上的讨论和 channel 的原理,来帮助大家加深对于 channel 的理解。关注腾讯云开发者,一手技术干货提前解锁01故事开始的地方——这段代码为什么会阻塞?开始,题主提出了这样一个问题:func main() { testContinue()}func testContinue() { in := make(chan *Content, 20) audit := make(chan *Content, 20) streamTextPreProcessStop := make(chan struct{}) // 向in协程无脑放2000个数据 go func() { for i := 0; i 50 { break } waitTimes++ time.Sleep(100 * time.Millisecond) } continue case content, ok := 50 { break } waitTimes++ time.Sleep(100 * time.Millisecond) } continue case content, ok := 命令,如果 -> 左边的语句返回 false,那它右边的语句就不会执行。通过这些输入输出命令,Hoare 证明了如果一门编程语言中把 processes 间的通信看得第一等重要,那么并发编程的问题就会变得简单。Go 是第一个将 CSP 的这些思想引入,并且发扬光大的语言。尽管内存同步访问控制在某些情况下很有用处,Go 里也有相应的 sync 包支持,但是这在大型程序很容易出错。Go 一开始就把 CSP 的思想融入到语言的核心里,所以并发编程成为 Go 的一个独特的优势,而且很容易理解。多数的编程语言的并发编程模型是 基于线程和内存同步访问控制 ,Go 的并发编程的模型则用 goroutine 和 channel 来替代。goroutine 和线程类似,channel 和 mutex 类似。goroutine 解放了程序员,让我们更能贴近业务去思考问题。而不用考虑各种像线程库、线程开销、线程调度等等这些繁琐的底层问题。channel 则天生就可以和其他 channel 组合。我们可以把收集各种子系统结果的 channel 输入到同一个 channel。channel 还可以和 select, cancel, timeout 结合起来。而 mutex 就没有这些功能。Go 的并发原则非常优秀,目标就是简单:尽量使用 channel;把 goroutine 当作免费的资源,随便用。(不过也有人对这个看法表示质疑,甚至后来 Go 语言的官方团队也表示,他们在某些场景中过度使用 goroutine 了,我们需要审视到底有没有必要使用它)3.2 channel 数据读写通道没有缓冲区时,从通道读取数据会阻塞,直到有协程向通道写入数据。类似的,向通道写入数据也会阻塞,直到有协程从通道读取数据。通道有缓冲区时,从通道读取数据,如果缓冲区没有数据也会阻塞,直到有协程写入数据。类似的,向通道写入数据时,如果缓冲区已满,也会阻塞,直到有协程从缓冲区中读出数据。对于值为 nil 的通道,无论读写都会阻塞,而且是永久阻塞。使用内置函数 close() 可以关闭通道,尝试向关闭的通道中写入数据会触发 panic,但关闭的通道仍然可以读。通道的读取表达式如下:value :=
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2024-12-29 12:51 , Processed in 0.738315 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表