golang不知道大家是否熟悉?今天我将给大家介绍《Go range 解决通道死锁问题,我应该关闭通道吗?》,这篇文章主要会讲到等等知识点,如果你在看完本篇文章后,有更好的建议或者发现哪里有问题,希
golang不知道大家是否熟悉?今天我将给大家介绍《Go range 解决通道死锁问题,我应该关闭通道吗?》,这篇文章主要会讲到等等知识点,如果你在看完本篇文章后,有更好的建议或者发现哪里有问题,希望大家都能积极评论指出,谢谢!希望我们能一起加油进步!
package main
import (
"fmt"
"sync"
)
func main(){
ch1 := make(chan int,100)
ct := 0
var wg sync.WaitGroup
wg.Add(1)
go func(){
//defer close(ch1)
for i:= 0; i < 10;i ++{
ch1 <- i
}
}()
go func(){
defer wg.Done()
for x := range ch1{
fmt.Println(x)
}
}()
wg.Wait()
fmt.Println("numbers:",ct)
}
为什么会返回此代码
致命错误:所有 goroutine 都在睡觉 - 死锁!
我发现如果我关闭频道就不会出现僵局,但我不知道为什么会这样。
将所有项目输入频道后是否必须关闭频道?
通道上的 for range
仅在通道关闭时终止。如果您不关闭通道并且不在其上发送更多值,则 for range
语句将永远阻塞,main
goroutine 位于 wg.wait()
处也将永远阻塞。
“发送者”方应在发送所有值后关闭通道,向“接收者”方发出信号,表示通道中不会再有任何值。
所以,是的,您应该关闭频道:
go func() {
defer close(ch1)
for i := 0; i < 10; i++ {
ch1 <- i
}
}()
文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《Go range 解决通道死锁问题,我应该关闭通道吗?》文章吧,也可关注编程网公众号了解相关技术文章。
--结束END--
本文标题: Go range 解决通道死锁问题,我应该关闭通道吗?
本文链接: https://www.lsjlt.com/news/596692.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-04-05
2024-04-05
2024-04-05
2024-04-05
2024-04-05
2024-04-05
2024-04-05
2024-04-05
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0