Go podle Příkladů: Opakující časovače (tickers)

Časovače jsou pro situace kdy chcete něco udělat jednou v budoucnu - opakující časovače tickers jsou pro situace kdy chcete něco provádět opakovaně v pravidelném interalu. Tady je příkad opakujícího se časovače který tiká periodicky dokud ho nezastavíme.

package main
import (
    "fmt"
    "time"
)
func main() {

Opakující časovače používají podobný mechanismus jako běžné časovače: kanál kterému je posílaná hodnota. Zde použijeme na kanálu zabudovaný příkaz select pro čekání na hodnoty, které do kanálu přijdou každých 500ms.

    ticker := time.NewTicker(500 * time.Millisecond)
    done := make(chan bool)
    go func() {
        for {
            select {
            case <-done:
                return
            case t := <-ticker.C:
                fmt.Println("Tik v", t)
            }
        }
    }()

Opakující časovače je možné stejně jako běžné časovače zastavit. Jakmile je časovač zastavený už nedostane do kanálu žádnou další hodnotu. Náš zastavíme po 1600ms.

    time.Sleep(1600 * time.Millisecond)
    ticker.Stop()
    done <- true
    fmt.Println("Ticker zastaven")
}

Když spustíme tento program, časovač by měl tiknout 3 krát předtím, než ho zastavíme.

$ go run tickers.go
Tik v 2009-11-10 23:00:00.5 +0000 UTC m=+0.500000001
Tik v 2009-11-10 23:00:01 +0000 UTC m=+1.000000001
Tik v 2009-11-10 23:00:01.5 +0000 UTC m=+1.500000001
Ticker zastaven

Další příklad: Zásobníky pracovních rutin (worker pools).