select 忽略慢速大小写?

select ignored slow case?

我在多个案例中使用了这样的 select

for {
    select {
    case data:= <- highFreqChan:
        // do something:
    case <- time.After(time.Second * 5):
        // send some heartbeat like data...
    }
}

我发现,如果highFreqChan数据量很大,heartbeat case不会进入,当停止向highFreqChan发送数据时,heartbeat case又活了,如何让它一直进入highFreqChan 还在工作时的心跳情况?

您是 运行 time.After 作为 select 条件的一部分,这意味着它在达到 select 时被评估...这意味着它将在 达到 select 后 5 秒 过期。因此,如果 highFreqChan 连续 5 秒没有任何数据,您只会进入这种情况。

如果您想 5 秒做一些事情,请改用time.Ticker,如下所示:

heartbeat := time.NewTicker(5 * time.Second)
defer heartbeat.Stop()
for {
    select {
    case data:= <- highFreqChan:
        // do something:
    case <- heartbeat.C:
        // send some heartbeat like data...
    }
}