2 回答

TA貢獻1872條經驗 獲得超4個贊
如果你愿意,你可以打電話給 sleep
dur := 1 * time.Second
nextDur := 3 * time.Second
for {
time.Sleep(dur)
dur, nextDur = nextDur, dur
...
}
或者,time.Timer如果需要,可以交替使用 a 中的持續時間select。這是我個人會堅持的,因為您不必擔心由于調度不一致而導致兩個計時器之間的偏移。
dur := 1 * time.Second
nextDur := 3 * time.Second
timer := time.NewTimer(dur)
for {
select {
case t := <-timer.C:
dur, nextDur = nextDur, dur
timer.Reset(dur)
...
}
...
}
或者運行 2 個定時器以較小的間隔偏移
dur1 := 1 * time.Second
dur2 := 3 * time.Second
timer1 := time.NewTimer(dur1)
timer2 := time.NewTimer(dur1 + dur2)
for {
select {
case t := <-timer1.C:
timer1.Reset(dur1 + dur2)
fmt.Println("timer1:", t)
case t := <-timer2.C:
timer2.Reset(dur1 + dur2)
fmt.Println("timer2:", t)
}
}
你也可以像最初嘗試的那樣運行交錯的 Tickers,但這需要更多的協調來延遲其中一個的啟動
dur1 := 1 * time.Second
dur2 := 3 * time.Second
ticker1 := time.NewTicker(dur1)
ticker2 := time.NewTicker(dur1 + dur2)
var once sync.Once
delayOnce := func() {
ticker1.Stop()
ticker1 = time.NewTicker(dur1 + dur2)
}
for {
select {
case t := <-ticker1.C:
once.Do(delayOnce)
fmt.Println("ticker1:", t)
case t := <-ticker2.C:
fmt.Println("ticker2:", t)
}
}

TA貢獻1818條經驗 獲得超11個贊
一種解決方案是只有 1 個每 5 秒滴答一次的股票代碼。5分鐘加5秒就是61*5秒。所以“周期”是 61 個滴答聲。每個61th刻度是 5 分鐘標記,每個61th+1刻度是 5 秒標記。由于只有一個股票代碼,因此甚至不需要select:
c, count := time.Tick(5*time.Second), 1
for {
<-c
count++
switch count % 61 {
case 0:
fmt.Println("5-min mark")
case 1:
fmt.Println("5-sec mark")
}
}
注意:由于count是用 初始化的1,第一個“任務”將是5-min mark,在啟動后 5 分鐘后執行。
另一種解決方案是使用 2 個time.Sleep()調用的序列,第一個是 5 分鐘,第二個是 5 秒:
for {
time.Sleep(5 * time.Minute)
fmt.Println("5-min mark")
time.Sleep(5 * time.Second)
fmt.Println("5-sec mark")
}
但是這個時間也取決于你執行的任務。所以要么使用第一個解決方案,要么在單獨的 goroutines 中執行任務,這樣它們就不會干擾時間,例如:
for {
time.Sleep(5 * time.Minute)
go func () {
fmt.Println("5-min mark")
}
time.Sleep(5 * time.Second)
go func () {
fmt.Println("5-sec mark")
}
}
- 2 回答
- 0 關注
- 253 瀏覽
添加回答
舉報