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).