​gorouting与channel的关系

​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

正在回答 回答被采纳积分+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) 后面去执行,这样因为会被及时消费,就不会被阻塞了。




  • bobby #1

    理论上来讲,我往channel写数据,但是没有消费者去消费这个channel逻辑上可以这样做,但是实际上这是错误的用法, go语言在编译的时候就防止你搞这种错误的写法,就直接给你报错,说是deadlock了,至于为什么是deadlock是因为channel内部是有锁的,你这里有生产者写入数据会加锁

    2023-01-02 15:21:44
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
Go开发工程师全新版
  • 参与学习       526    人
  • 解答问题       606    个

风口上的技术,薪资水平遥遥领先,现在学习正值红利期! 未来3-5年,Go语言势必成为企业高性能项目中不可替代的语言 从基础到项目实战再到重构,对转行人员友好,真正从入门到精通!

了解课程
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师