【发布时间】:2021-09-13 16:02:23
【问题描述】:
考虑一下这个 Go 代码,它会立即调用 worker.DoWork(),然后每分钟调用一次:
triggerChan := make(chan time.Time, 1)
triggerChan <- time.Now() // We don't want to wait a minute for the first call of worker.DoWork() to happen.
ticker := time.NewTicker(time.Minute)
defer ticker.Stop()
for {
select {
case triggerChan <- <-ticker.C:
case <-triggerChan:
worker.DoWork()
}
}
在第一个 select 之前将值写入 triggerChan 以将其定向到 case <-triggerChan 以立即调用 worker.DoWork()。然而,如果ticker.C 已经有一个可用的值(如果我们使用类似time.Microsecond 而不是time.Minute,这不太可能),会发生什么?运行时是否会看到triggerChan <- <-ticker.C 会阻塞,或者它是否会愉快地软锁定而不知道试图对<-ticker.C 的结果执行什么操作?它是否意识到这种“从渠道到渠道”的情况?
【问题讨论】:
-
因为表达式
<-ticker.C在进入选择时被评估,所以直到第一个滴答声才会完成。 -
@PenelopeStevens 这里有一些严重的过度工程的充分基础。我按照你的建议做了。