请稍等 ...
×

采纳答案成功!

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

deadlock

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")
<-forever

老师,这里只有收数据,没有发数据的地方,为什么不会deadlock

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

3回答

Cap 2019-07-01 17:35:13

这里有个坑要注意下,用rabbitmq的时候隐性的异步协程,这个携程一直运行,程序才不会出现死锁。

你这样写,表示所有协程都结束了,但是通过channel还在等待资源释放就导致了死锁,如果有任何一个协程没结束就不会有死锁。

1 回复 有任何疑惑可以回复我~
Cap 2019-06-26 11:39:12

我们main函数本身是一个 goroutine,go func() { 启动了另一个信道,这里使用的是无缓冲信道。

从无缓冲信道取数据,必须要有数据流进来才可以,否则当前goroutine阻塞(main.go 等待结束);



1 回复 有任何疑惑可以回复我~
  • 提问者 IT小书童z #1
    好像明白了,msgs也是一个chan , 看amqp 源码,<-chan Delivery
    回复 有任何疑惑可以回复我~ 2019-06-27 00:07:26
  • 提问者 IT小书童z #2
    func testChan() {
    	forever := make(chan bool)
    	strings := make(chan string)
    	go func() {
    		for d := range strings {
    			//实现我们要处理的逻辑函数
    			log.Printf("Received a message: %s", d)
    		}
    	}()
    	log.Printf("[*] Waiting for messages,To exit press CTRL")
    	<-forever
    }
    
    老师,我模拟了一个consume最后的并发,还是不明白,forever没有发送,一直接收,就要deadlock,看rabbitMq中的consume方法就不会。这里还是不明白
    回复 有任何疑惑可以回复我~ 2019-06-28 00:15:27
  • Cap 回复 提问者 IT小书童z #3
    这里有个坑要注意下,用rabbitmq的时候隐性的异步协程,这个携程一直运行,程序才不会出现死锁。
    
    你这样写,表示所有协程都结束了,但是通过channel还在等待资源释放就导致了死锁,如果有任何一个协程没结束就不会有死锁。
    回复 有任何疑惑可以回复我~ 2019-07-01 19:27:11
提问者 IT小书童z 2019-06-27 00:01:45
func main() {
   forever := make(chan bool)
   var msgs  = "12123123123123"
   //log.Printf("[*] Waiting for messages,To exit press CTRL+c")
   go func() {
      for d := range msgs {
         //实现我们要处理的逻辑函数
         log.Printf("Received a message: %d", d)
      }
   }()
   <-forever
}

但是我单独拿出来,这样写,就会deadlock


2019/06/26 01:42:14 Received a message: 0

2019/06/26 01:42:14 Received a message: 1

2019/06/26 01:42:14 Received a message: 2

2019/06/26 01:42:14 Received a message: 3

2019/06/26 01:42:14 Received a message: 4

2019/06/26 01:42:14 Received a message: 5

2019/06/26 01:42:14 Received a message: 6

2019/06/26 01:42:14 Received a message: 7

2019/06/26 01:42:14 Received a message: 8

2019/06/26 01:42:14 Received a message: 9

2019/06/26 01:42:14 Received a message: 10

2019/06/26 01:42:14 Received a message: 11

2019/06/26 01:42:14 Received a message: 12

2019/06/26 01:42:14 Received a message: 13

fatal error: all goroutines are asleep - deadlock!


goroutine 1 [chan receive]:

main.main()

D:/work/go/src/rabbitmqDemo/mainSimplePublish.go:20 +0x8b


Process finished with exit code 2


0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

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

帮助反馈 APP下载

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

公众号

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