在golang实战开发的过程中,我们经常会遇到一些这样那样的问题,然后要卡好半天,等问题解决了才发现原来一些细节知识点还是没有掌握好。今天编程网就整理分享《在 Goroutine 中添加 selec
在golang实战开发的过程中,我们经常会遇到一些这样那样的问题,然后要卡好半天,等问题解决了才发现原来一些细节知识点还是没有掌握好。今天编程网就整理分享《在 Goroutine 中添加 select default 语句导致通道阻塞》,聊聊,希望可以帮助到正在努力赚钱的你。
问题内容func main() {
ch := make(chan int)
go func() {
select {
case ch <- 1:
fmt.println("send suc")
default: // if comment this line, it will run smoothly
fmt.println("default")
}
}()
time.sleep(2) // do some time consuming thing...
fmt.printf("receive val: %d", <-ch)
}
我预计不会出现死锁,但结果是:
default
fatal error: all goroutines are asleep - deadlock!
但是如果我删除 default
或 time.sleep(2)
,代码将顺利运行,结果:
send suc
receive val: 1
有人能解释一下为什么会发生死锁吗?
您有一个 select
和 default
,这意味着如果没有任何通信操作准备就绪,select
不会等待,不会阻塞,而是立即执行 default
。该通道未缓冲,因此其上的发送尚未准备好(因为没有准备好的接收器 - main
正在休眠)。
因此,一旦 main
的睡眠结束,它就会尝试从通道接收数据,但那时没有人尝试在其上发送数据。死锁。
终于介绍完啦!小伙伴们,这篇关于《在 goroutine 中添加 select default 语句导致通道阻塞》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~编程网公众号也会发布Golang相关知识,快来关注吧!
--结束END--
本文标题: 在 goroutine 中添加 select default 语句导致通道阻塞
本文链接: https://lsjlt.com/news/595840.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-04-05
2024-04-05
2024-04-05
2024-04-04
2024-04-05
2024-04-05
2024-04-05
2024-04-05
2024-04-04
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0