Go в примерах: Тикеры (повторения) (Tickers)

Таймеры необходимы, когда надо выполнить что-то в будущем один раз, а тикеры позволяют повторять действия через определенные интервалы. Вот пример того, как тикер выводит сообщение Tick at... через заданный период, пока мы не остановим его.

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

Тикеры используют тот же механизм, что и таймеры: канал, в который посылаются значения. Здесь мы будем использовать range для чтения данных из канала, которые будут поступать в него каждые 500мс.

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

Тикеры могут быть остановлены так же как и таймеры. Когда тикер будет остановлен, он не сможет больше принимать значения в свой канал. Мы остановим его через 1600мс.

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

Когда мы запускаем эту программу, тикер должен выполнится 3 раза, после чего остановиться.

$ go run tickers.go
Tick at 2012-09-23 11:29:56.487625 -0700 PDT
Tick at 2012-09-23 11:29:56.988063 -0700 PDT
Tick at 2012-09-23 11:29:57.488076 -0700 PDT
Ticker stopped

Следующий пример: Пулы воркеров (Worker Pools).