【问题标题】:Read from one channel and write to another within one select-case在一个选择案例中从一个通道读取并写入另一个通道
【发布时间】: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 &lt;-triggerChan 以立即调用 worker.DoWork()。然而,如果ticker.C 已经有一个可用的值(如果我们使用类似time.Microsecond 而不是time.Minute,这不太可能),会发生什么?运行时是否会看到triggerChan &lt;- &lt;-ticker.C 会阻塞,或者它是否会愉快地软锁定而不知道试图对&lt;-ticker.C 的结果执行什么操作?它是否意识到这种“从渠道到渠道”的情况?

【问题讨论】:

  • 因为表达式&lt;-ticker.C 在进入选择时被评估,所以直到第一个滴答声才会完成。
  • @PenelopeStevens 这里有一些严重的过度工程的充分基础。我按照你的建议做了。

标签: go channel


【解决方案1】:

select 根据triggerChan 的状态决定,但它首先评估发送操作的右侧表达式。 所以在进入时,它会等到

【讨论】:

    猜你喜欢
    • 2016-06-28
    • 2020-05-18
    • 1970-01-01
    • 1970-01-01
    • 2013-07-03
    • 2012-01-11
    • 2020-04-04
    • 2019-10-08
    • 2023-03-17
    相关资源
    最近更新 更多