Go by Example: Timers

A menudo queremos ejecutar código Go en algún momento en el futuro, o repetidamente a cierto intervalo. Las características de timer (temporizador) y ticker (marcador) incorporadas en Go hacen que ambas tareas sean fáciles. Primero veremos los temporizadores y luego los tickers.

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

Los temporizadores representan un único evento en el futuro. Tú le indicas al temporizador cuánto tiempo quieres esperar, y este proporciona un canal que será notificado en ese momento. Este temporizador esperará 2 segundos.

    timer1 := time.NewTimer(2 * time.Second)

El <-timer1.C bloquea en el canal C del temporizador hasta que envía un valor indicando que el temporizador se activó.

    <-timer1.C
    fmt.Println("Timer 1 fired")

Si solo quisieras esperar, podrías haber usado time.Sleep. Una razón por la que un temporizador puede ser útil es que puedes cancelar el temporizador antes de que se active. Aquí hay un ejemplo de eso.

    timer2 := time.NewTimer(time.Second)
    go func() {
        <-timer2.C
        fmt.Println("Timer 2 fired")
    }()
    stop2 := timer2.Stop()
    if stop2 {
        fmt.Println("Timer 2 stopped")
    }

Dale al timer2 suficiente tiempo para activarse, si alguna vez iba a hacerlo, para mostrar que de hecho está detenido.

    time.Sleep(2 * time.Second)
}

El primer temporizador se activará ~2s después de que iniciemos el programa, pero el segundo debería detenerse antes de tener la oportunidad de activarse.

$ go run timers.go
Timer 1 fired
Timer 2 stopped

Siguiente ejemplo: Tickers.