首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Golang事件驱动模型

Golang事件驱动模型
EN

Stack Overflow用户
提问于 2017-11-25 09:59:41
回答 1查看 1.4K关注 0票数 1

我正在阅读RabbitMQ教程,并看到以下代码:

代码语言:javascript
复制
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。这对于循环如何处理事件?例如:在应用程序启动时,msgs队列缓冲区中只有一条消息。

问题:

  1. 它将如何处理下一个事件?
  2. 在使用这段代码进行了一些游玩之后,我发现它可以卡在log.Printf行上,不再处理事件了。什么能成为理由?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-25 11:01:18

  1. 它将如何处理下一个事件?

除了对基本数据结构进行迭代,GoLang中的GoLang还可以迭代从一个通道接收到的值。范围遍历每个元素,因为它是从队列中接收到的,并且只有在通道关闭时才结束。下一次迭代将在通道(msgs)接收到一个值时进行。

代码语言:javascript
复制
msgs <- message

  1. 在对这段代码进行了一些处理之后,我发现它可能卡在log.Printf行上,不会再处理事件了。什么能成为理由?

考虑到有一个阻塞通道 forever,并且我们有一个在msgs信道上迭代的范围,有两个可能的操作是预期的:

任一

  1. 通过msgs通道发送消息 msgs <-消息

  1. 将值发送给forever,使其解除对进程的阻塞 永远<-假

该解决方案似乎是为、等待、和通过通道异步处理消息而设计的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47484693

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档