gorouting与channel的关系
package main
import (
"fmt"
"time"
)
func producer(out chan<- int) {
for i := 0; i < 10; i++ {
out <- i * i
}
close(out)
}
func consumer(in <-chan int) {
for num := range in {
fmt.Printf("num = %d\r\n", num)
}
}
func main() {
// channel 默认是双向的
//双向channel
//var ch1 chan int
//单向channel 只能写入float64
//var ch2 chan<- float64
//单向channel 只能读取
//var ch3 <-chan int
c := make(chan int)
go producer(c)
go consumer(c)
time.Sleep(time.Second * 10)
}您好老师,请问如上代码再运行时,
gorouting与channel的关系是什么,这里没太明白,因为我去掉 go producer() 前边的go时报错了deadlock
20
收起
正在回答 回答被采纳积分+1
1回答
蟹黄包12138
2022-12-31 22:32:02
当你去掉 go producer(c) 前边的go时,意味着producer方法是由main线程(即主线程)来执行的,同时c这个channel是一个无缓冲的,并且producer方法是放在go consumer(c) 之前去执行的,那么主线程就会因为没有自己放进c中的数据没有被消费,而被阻塞住,而go consumer(c) 也就无法被执行,也就是deadlock了。
你可以把c改成有缓冲的,并且大小为循环次数(即10),这样就可以不给 producer方法开新线程;
或者你可以把producer方法放在go consumer(c) 后面去执行,这样因为会被及时消费,就不会被阻塞了。
Go开发工程师全新版
- 参与学习 526 人
- 解答问题 606 个
风口上的技术,薪资水平遥遥领先,现在学习正值红利期! 未来3-5年,Go语言势必成为企业高性能项目中不可替代的语言 从基础到项目实战再到重构,对转行人员友好,真正从入门到精通!
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星