Go Academy · Pelajaran

Batas Waktu dan Ticker

Menggunakan time.After dan time.Tick dengan select

Pelajaran 2 dari 413 langkah

Batas Waktu dan Ticker adalah pelajaran Go Academy gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Go Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Go Academy mencakup 4 pelajaran total.

Mengapa Batas Waktu Penting

Tanpa batas waktu, rutin Go yang menunggu kanal lambat dapat memblokir selamanya. Paket time menyediakan primitif untuk menambahkan kendali berbasis waktu pada operasi kanal.

time.After untuk Batas Waktu Sekali Pakai

time.After(d) mengembalikan kanal yang menerima nilai setelah durasi d berlalu. Gunakan dalam kasus select untuk membatalkan penantian.

select {
case res := <-ch:
    fmt.Println(res)
case <-time.After(2 * time.Second):
    fmt.Println("timed out")
}

Batas Waktu Berulang dengan time.NewTimer

Untuk pewaktu yang dapat digunakan kembali, gunakan time.NewTimer dan panggil Reset setelah setiap penggunaan. Panggil Stop untuk mencegah kebocoran rutin pewaktu.

timer := time.NewTimer(5 * time.Second)
defer timer.Stop()
select {
case <-timer.C:
    fmt.Println("timer fired")
}

time.Tick vs time.NewTicker

time.Tick memang praktis, tetapi menyebabkan kebocoran ticker yang mendasarinya—lebih baik gunakan time.NewTicker agar Anda dapat memanggil Stop() untuk membebaskan sumber daya.

ticker := time.NewTicker(500 * time.Millisecond)
defer ticker.Stop()
for range ticker.C {
    fmt.Println("tick")
}

Ticker dalam Perulangan

Gabungkan ticker dengan kanal penyelesaian untuk menjalankan pekerjaan berkala yang berhenti dengan rapi.

ticker := time.NewTicker(time.Second)
done := make(chan struct{})
go func() {
    for {
        select {
        case <-ticker.C:
            doWork()
        case <-done:
            ticker.Stop()
            return
        }
    }
}()

Kebocoran time.After

time.After membuat pewaktu baru setiap kali dipanggil dan pewaktu tersebut tidak dapat dikumpulkan oleh pembersih memori hingga aktif. Dalam perulangan yang sangat rapat, gunakan time.NewTimer + Reset untuk menghindari kebocoran pewaktu.

Tenggat Waktu vs Batas Waktu

Batas waktu adalah durasi relatif ("tunggu 5 detik"). Tenggat waktu adalah waktu absolut ("tunggu hingga pukul 14.00"). Gunakan time.Until(deadline) untuk mengubah tenggat waktu menjadi durasi bagi time.After.

deadline := time.Now().Add(5 * time.Second)
select {
case v := <-ch:
    use(v)
case <-time.After(time.Until(deadline)):
    fmt.Println("deadline exceeded")
}

context.WithTimeout Lebih Disarankan

Untuk penangan HTTP dan pekerjaan terstruktur, lebih baik gunakan context.WithTimeout daripada batas waktu kanal mentah—konteks meneruskan pembatalan melalui tumpukan pemanggilan secara otomatis.

ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel()

Pembatasan Laju dengan Ticker

Ticker adalah pembatas laju paling sederhana: kirim satu permintaan setiap detak. Untuk mendukung lonjakan, isi terlebih dahulu kanal berpenyangga dan isi ulang dengan ticker.

requests := make(chan int, 5)
for i := 0; i < 5; i++ { requests <- i }
close(requests)
limiter := time.NewTicker(200 * time.Millisecond)
for req := range requests {
    <-limiter.C
    fmt.Println("request", req)
}

Jam Monotonik

Durasi pewaktu Go menggunakan jam monotonik, bukan jam dinding, sehingga kebal terhadap penyesuaian jam sistem. time.Since dan time.Until juga menggunakannya.

Menghentikan Ticker dengan Benar

Setelah ticker.Stop(), kanal ticker tidak ditutup—ticker hanya berhenti menerima. Jika perlu, kosongkan nilai yang masih tertunda di kanal sebelum mengembalikan hasil.

Pemeriksaan Singkat

Mengapa time.NewTicker lebih disarankan daripada time.Tick?

Ringkasan: Batas Waktu dan Ticker

Poin penting:

  • time.After untuk batas waktu sekali pakai dalam select
  • time.NewTicker untuk pekerjaan berulang; selalu panggil Stop()
  • Hindari time.After dalam perulangan—ini menyebabkan kebocoran pewaktu
  • Lebih baik gunakan context.WithTimeout untuk pekerjaan yang dapat dibatalkan
Gratis untuk memulai

Belajar Go dengan tutor AI — gratis

Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.

Kursus
51
Pelajaran
203

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Batas Waktu dan Ticker” gratis?

Ya — teks lengkap “Batas Waktu dan Ticker” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Go Academy, upgrade ke CoddyKit PRO. Kursus Go Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Batas Waktu dan Ticker”?

Menggunakan time.After dan time.Tick dengan select Kamu berlatih Go Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Go Academy?

Tidak diperlukan pengalaman sebelumnya. Go Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.

Berapa lama pelajaran “Batas Waktu dan Ticker” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Go Academy ini?

Ya. Setiap pelajaran Go Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Pernyataan select
  2. Batas Waktu dan Ticker
  3. Pola Fan-in dan Fan-out
  4. Pola Kumpulan Worker
← Kembali ke Go Academy