我在尝试时遇到了这个问题time.Ticker。
如下面的代码,case <-time.After(time.Millisecond * 5500):从不执行,程序重复打印“ticker”和“chan”。
谁能解释一下吗?
package main
import (
"fmt"
"os"
"time"
)
func main() {
ticker := time.NewTicker(time.Second * 2)
defer ticker.Stop()
ch := time.Tick(time.Second * 3)
for {
select {
case t := <-ticker.C:
fmt.Println("From ticker:", t)
case t := <-ch:
fmt.Println("From chan:", t)
case <-time.After(time.Millisecond * 5500):
fmt.Println("timeout, exit")
os.Exit(1)
}
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
From ticker: 2021-02-02 11:31:55.9902354 +0800 CST m=+2.002391201
From chan: 2021-02-02 11:31:56.990678 +0800 CST m=+3.002835701
From ticker: 2021-02-02 11:31:57.9900811 +0800 CST m=+4.002240701
From chan: 2021-02-02 11:31:59.9901219 +0800 CST m=+6.002285301
From ticker: 2021-02-02 11:31:59.9901219 +0800 CST m=+6.002285301
From ticker: 2021-02-02 11:32:01.9901347 +0800 CST m=+8.002301901
From chan: 2021-02-02 11:32:02.990973 +0800 CST m=+9.003142101
From ticker: 2021-02-02 11:32:03.9899932 +0800 CST m=+10.002164201
From ticker: 2021-02-02 11:32:05.9911548 +0800 CST m=+12.003329601
From chan: 2021-02-02 11:32:05.9911548 +0800 CST m=+12.003329601
From ticker: 2021-02-02 11:32:07.9898197 +0800 CST m=+14.001998301
Run Code Online (Sandbox Code Playgroud)
一切都按预期进行。您的前两种情况总是在不到 5500 毫秒的时间内产生一个值,所以不会,time.After永远不会产生一个值。
每次select遇到 时,都会返回一个新time.After通道,该通道将在 5.5 秒内发出一个值。实际上,您永远不会等待 5.5 秒,因为两个代码总是首先发出值,因此永远不会执行该time.After分支select,并且该通道将被丢弃。