首页 > 解决方案 > 连续向多个通道发送数据

问题描述

我有以下场景:每分钟调用一个函数,每次调用它都会尝试将数据发送到多个定义的通道。

var chan1 = make(chan bool)
var chan2 = make(chan bool)
var chan3 = make(chan bool)

go func() {
 for {
  <-time.After(1* time.Minute)
  chan1 <- true
  chan2 <- false
  chan3 <- true
 }
}()

然后在三个单独的 go 例程中,每个通道都通过select类似的方式读取。

go func() {
 var myVar bool

 select {
   case <- chan1: //or chan2, chan3 etc...
     myVar = true
   default:
     myVar = false
}()

问题是仅从chan1第一次基于时间的循环中接收数据。因此,似乎正在发生的是所有后续通道的数据发送被阻止,直到第一个通道被读取。我将如何纠正这一点?

标签: gochannelgoroutine

解决方案


使用缓冲通道

var chan1 = make(chan bool, 1)
var chan2 = make(chan bool, 1)
var chan3 = make(chan bool, 1)

或者异步运行发送:

go func() {
    chan1 <- true
}()

推荐阅读