← Kembali ke kursus
Pelajaran kursus · Go
Pelajaran 36

Timer, Ticker, & scheduler

Jadwalkan sekali atau berulang dengan waktu.

Pahami konsepnya

time.NewTimer(durasi) membuat timer yang mengirim satu nilai waktu ke channel .C setelah durasi berlalu — sekali saja. Menerimanya lewat <-t.C menahan program tepat sampai alarm berbunyi; time.Sleep(d) adalah versi singkatnya bila tidak butuh channel.

time.NewTicker(durasi) adalah alarm berulang: channel .C-nya menerima nilai setiap durasi — detak jantung untuk polling berkala, animasi, pengambilan data rutin. Ticker mampu dihentikan lewat .Stop() bila tidak lagi dipakai (dan channel-nya harus dikosongkan bila masih ada penerima). Timer pun bisa dibatalkan sebelum berbunyi dengan .Stop().

Kombinasi ticker + select + timeout adalah cetakan tugas terjadwal modern: satu loop yang setiap detak memeriksa pekerjaan, sambil siap dihentikan lewat channel sinyal atau batas waktu. Untuk penjadwalan kompleks lintas proses, ada pustaka cron — tapi dalam satu proses, ticker sudah sangat jauh.

Coba contoh kode

package main

import (
    "fmt"
    "time"
)

func main() {
    timer := time.NewTimer(1 * time.Second)
    fmt.Println("menunggu alarm...")
    <-timer.C
    fmt.Println("alarm berbunyi!")
}

Timer mengirim waktu kecualinya ke channel C tepat satu detik kemudian; penerimaan <-timer.C menjadi titik tunggu yang rapi. Bedanya dengan Sleep: channel C bisa dijadikan case select — digabung dengan sinyal lain atau timeout — sesuatu yang Sleep tidak bisa.

Ticker: detak berulang

func main() {
    ticker := time.NewTicker(300 * time.Millisecond)
    selesai := time.After(1200 * time.Millisecond)

    for {
        select {
        case t := <-ticker.C:
            fmt.Println("detak", t.Format("15:04:05.000"))
        case <-selesai:
            ticker.Stop()
            fmt.Println("selesai")
            return
        }
    }
}

Loop ini berdetak tiap 300 ms sementara time.After memasang batas akhir 1,2 detik — select menyeimbangkan keduanya. Saat batas tiba, ticker.Stop() memberhentikan detak dan loop keluar: pola penjadwal yang bisa dihentikan dengan bersih.

Latihan singkat

Uji: ticker 500 ms — program harus mencetak `detak 1` sampai `detak 5` lalu `selesai` (enam baris, lalu berhenti).