请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

子goroutine出现all goroutines are asleep - deadlock!问题

代码1:

	forever := make(chan bool)
	//启用协程处理消息
	go func() {
		for d := range msgs {
			//消息逻辑处理,可以自行设计逻辑
			log.Printf("Received a message: %s", d.Body)
		}
	}()

	log.Printf(" [*] Waiting for messages. To exit press CTRL+C")
	<-forever

代码2:

func main() {
	forever := make(chan bool)
	xx := make(chan bool)
	msgs := (<-chan bool)(xx)

	go func() {
		log.Println("aaa")
		for d := range msgs {
			log.Println("Received a message:", d)
		}
	}()
	log.Print("bbb")
	<-forever
}

老师,这代码1是项目中的消费端代码,其中中的msgs其实是一个用于接收的单向通道,这里forever也是一个通道,但这里却不会出现fatal error: all goroutines are asleep - deadlock!

而代码2是我用一个单向通道去模拟msgs的,这却会报以上错误,为啥啊?

正在回答 回答被采纳积分+3

2回答

因为xx是channel, 需要一头写入另一头才能读取. 所以xx需要另开一个goroutine有写入才行.  否则msgs是从xx里读的, 没有写入就死锁了.

func main() {
    forever := make(chan bool)
    xx := make(chan bool, 10000)
    msgs := (<-chan bool)(xx)

    go func() {
        log.Println("aaa")
        for d := range msgs {
            log.Println("Received a message:", d)
            time.Sleep(time.Second)
        }
    }()
    go func() {
        for {
            xx <- true
            time.Sleep(time.Second)
        }
    }()
    log.Print("bbb")
    <-forever
}


0 回复 有任何疑惑可以回复我~
Cap 2020-06-22 09:29:42

这里牵涉到死锁的概念,如果是同学这样写的话 当程序执行到 range msgs 的时候会阻塞等等写入,这时候两个goroutines(main,go func)都在等带信息的写入。导致了死锁。

同学可以在 import 里面 加 _ "github.com/streadway/amqp"  试下



0 回复 有任何疑惑可以回复我~
  • 提问者 Rayer #1
    加 _ 不是会只执行引入包的init吗?而且里面的函数接口都不能调用了,会出现undefine错误,没明白老师的意思。。。
    回复 有任何疑惑可以回复我~ 2020-06-22 16:45:18
  • Cap #2
    是在你写的test代码上加,如果要用,正常导入就可以了。
    回复 有任何疑惑可以回复我~ 2020-06-22 18:07:32
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

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

帮助反馈 APP下载

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

公众号

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