【问题标题】:Event driven model in GolangGolang 中的事件驱动模型
【发布时间】:2017-11-25 09:59:41
【问题描述】:

我正在阅读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 行并且不再处理事件。可能是什么原因?

【问题讨论】:

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


    【解决方案1】:
    1. 它将如何处理下一个事件?

    除了对基本数据结构的迭代之外,GoLang 中的range 还可以对从通道接收到的值进行迭代。 Range 在从队列中接收到每个元素时对其进行迭代,并且仅在通道关闭时结束。 下一次迭代将在通道(msgs)接收到一个值时发生

    msgs <- message
    
    1. 在玩弄了这段代码之后,我发现它可能会卡在 log.Printf 行并且不再处理事件。可能是什么原因?

    考虑到有一个blocking channel forever 并且我们有一个在msgs 通道上迭代的范围,因此预期有两种可能的操作:

    要么

    1. 通过消息通道发送消息

      消息

    1. 将值发送到forever,以便它解除对进程的阻塞

      永远

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

    【讨论】:

      猜你喜欢
      • 2016-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-19
      • 2010-09-27
      • 1970-01-01
      • 2016-06-21
      • 1970-01-01
      相关资源
      最近更新 更多