动态改变股票代码间隔

dam*_*ser 7 go ticker

我想动态更改我的自动收报机间隔.

我写了一个例子来告诉你我是怎么做的.我的用例不是"加速度计",但我希望它能给你一个想法.

http://play.golang.org/p/6ANFnoE6pA

package main

import (
    "time"
    "log"
    "fmt"
)

func main() {
    interval := float64(1000)

    ticker := time.NewTicker(time.Duration(interval) * time.Millisecond)
    go func(){
        counter := 1.0
        for range ticker.C {
            log.Println("ticker accelerating to " + fmt.Sprint(interval/counter) + " ms")
            ticker = time.NewTicker(time.Duration(interval/counter) * time.Millisecond)
            counter++
        }
        log.Println("stopped")
    }()
    time.Sleep(5 * time.Second)
    log.Println("stopping ticker")
    ticker.Stop()
}
Run Code Online (Sandbox Code Playgroud)

有问题的是,自动收报机每秒都会"嘀嗒"一声并且它不会加速......任何想法?

dam*_*ser 8

遵循@fzerorubigd的答案,但更完整一些。

如前所述,我们不能在range这种情况下使用 ,因为range循环缓存要删除的变量,然后它不能被覆盖(例如:http : //play.golang.org/p/yZvrgURz4o

然后,我们应该使用for-select组合循环。此后的工作解决方案:

http://play.golang.org/p/3uJrAIhnTQ

package main

import (
    "time"
    "log"
    "fmt"
)

func main() {
    start_interval := float64(1000)
    quit := make(chan bool)

    go func(){
        ticker := time.NewTicker(time.Duration(start_interval) * time.Millisecond)
        counter := 1.0

        for {
            select {
            case <-ticker.C:
                log.Println("ticker accelerating to " + fmt.Sprint(start_interval/counter) + " ms")
                ticker.Stop()
                ticker = time.NewTicker(time.Duration(start_interval/counter) * time.Millisecond)
                counter++
            case <-quit:
                ticker.Stop()
                log.Println("..ticker stopped!")
                return
            }
        }
    }()

    time.Sleep(5 * time.Second)

    log.Println("stopping ticker...")
    quit<-true

    time.Sleep(500 * time.Millisecond) // just to see quit messages
}
Run Code Online (Sandbox Code Playgroud)


Isa*_*ten 5

这就是为什么在 go1.15 中ticker.Reset引入了,您不需要创建新的股票代码并使用 更新现有股票代码的持续时间ticker.Reset("new duration"),现在您将不会遇到任何缓存问题

去游乐场

package main

import (
    "fmt"
    "log"
    "time"
)

func main() {
    interval := float64(1000)

    ticker := time.NewTicker(time.Duration(interval) * time.Millisecond)
    go func(){
        counter := 1.0
        for range ticker.C {
            log.Println("ticker accelerating to " + fmt.Sprint(interval/counter) + " ms")
            ticker.Reset(time.Duration(interval/counter) * time.Millisecond)
            counter++
        }
        log.Println("stopped")
    }()
    time.Sleep(5 * time.Second)
    log.Println("stopping ticker")
    ticker.Stop()
}
Run Code Online (Sandbox Code Playgroud)

您的示例存在缓存问题的原因是,当您使用结构重新分配ticker变量时*time.ticker,您只需取消原始*time.ticker结构与ticker变量的链接,但循环仍然是原始的股票通道,您需要重新设置一个新的循环到新的通道time.ticker.c