Golang中的事件驱动模型

时间:2017-11-25 09:59:41

标签: for-loop go rabbitmq message-queue event-driven

我正在阅读RabbitMQ tutorial并看到以下代码:

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

我感兴趣的是for d := range msgs。这个for循环如何处理事件?例如。在应用程序启动时,我在msgs队列缓冲区中只有一条消息。

问题:

  1. 如何处理下一个活动?
  2. 在使用此代码的playing around之后,我发现它可能会停留在log.Printf行,并且不再处理事件。可能是什么原因?

1 个答案:

答案 0 :(得分:1)

  
      
  1. 如何处理下一个活动?
  2.   

除了对基本数据结构的迭代之外,GoLang中的range还可以迭代从通道接收的值。范围在从队列接收时迭代每个元素,并且仅在信道关闭时结束。 当通道(msgs)将接收值

时,将发生下一次迭代
msgs <- message
  
      
  1. 在玩了一些代码之后,我发现它可能会停留在log.Printf行上,并且不再处理事件。可能是什么原因?
  2.   

考虑到blocking channel forever并且我们有一个范围在msgs频道上进行迭代,可能会有两种可能的操作:

要么

  1. 通过msgs频道发送消息

    msgs&lt; - message

    1. 将值发送到forever,以便取消阻止流程

      永远&lt; - false

    2. 似乎该解决方案旨在等待并通过渠道异步处理消息。