0Pricing
Go Academy · Pelajaran

Deteksi Kebocoran dan Pembatalan

Memastikan goroutine berhenti dan mencegah kebocoran

Deteksi Kebocoran dan Pembatalan adalah pelajaran Go Academy gratis di CoddyKit. Ini adalah pelajaran 4 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.

Apa itu kebocoran gorutin?

Kebocoran gorutin terjadi ketika sebuah gorutin dimulai tetapi tidak pernah berhenti. Gorutin yang bocor terus menumpuk seiring waktu, menggunakan memori stack dan CPU hingga proses dihentikan.

Kebocoran umum: penerimaan kanal yang terblokir

Gorutin yang menunggu penerimaan dari kanal yang tidak pernah mendapatkan nilai akan terblokir selamanya:

go func() {
    v := <-ch // leaks if no sender and ch is never closed
    use(v)
}()

Kebocoran umum: tanpa sinyal selesai

Gorutin dalam perulangan for tanpa kondisi keluar atau kanal selesai akan berjalan selamanya:

go func() {
    for {
        work()
        // no exit condition — leaks
    }
}()

Mendeteksi kebocoran dengan goleak

go.uber.org/goleak memverifikasi bahwa tidak ada gorutin yang bocor pada akhir pengujian:

func TestMyFunc(t *testing.T) {
    defer goleak.VerifyNone(t)
    myFunc() // should not leak goroutines
}

Konteks sebagai solusi

Cara idiomatis untuk menghentikan gorutin yang berjalan lama adalah menggunakan konteks. Teruskan ctx ke gorutin, lalu lakukan select pada ctx.Done().

go func(ctx context.Context) {
    for {
        select {
        case work := <-workCh:
            process(work)
        case <-ctx.Done():
            return // clean exit
        }
    }
}(ctx)

Pola kanal selesai

Untuk kasus yang lebih sederhana tanpa konteks, gunakan kanal selesai khusus. Tutup kanal tersebut untuk menyiarkan sinyal berhenti ke semua gorutin yang membacanya.

done := make(chan struct{})
go func() {
    select {
    case v := <-data: use(v)
    case <-done: return
    }
}()
close(done) // stops goroutine

Mendeteksi dengan runtime

Cetak jumlah gorutin untuk mendeteksi pertumbuhan saat program berjalan:

fmt.Println("goroutines:", runtime.NumGoroutine())

Gorutin server HTTP

net/http secara otomatis mengelola gorutin untuk setiap permintaan dan membersihkannya saat permintaan selesai. Namun, penangan yang meluncurkan gorutin tanpa pembersihan tetap dapat menyebabkan kebocoran.

Menguji kebocoran

Jalankan rangkaian pengujian Anda dengan goleak sebagai TestMain atau defer per pengujian. Gorutin apa pun yang belum berhenti setelah badan pengujian selesai akan menyebabkan kegagalan pengujian.

func TestMain(m *testing.M) {
    goleak.VerifyTestMain(m)
}

Kebocoran Time.After

time.After dalam select di dalam perulangan membuat pewaktu baru pada setiap iterasi yang tidak dapat dibersihkan oleh GC hingga pewaktu tersebut terpicu. Gantilah dengan time.NewTimer dan Reset.

Kebocoran akibat gorutin yang mengembalikan kesalahan

Jika sebuah gorutin seharusnya mengirim hasil melalui kanal tetapi berhenti lebih awal karena kesalahan tanpa mengirim apa pun, gorutin konsumen akan terblokir selamanya. Selalu kirim hasil atau tutup kanal pada semua jalur eksekusi.

Pemeriksaan Singkat

Apa cara paling idiomatis untuk menghentikan gorutin yang berjalan lama di Go?

Ringkasan: Deteksi Kebocoran dan Pembatalan

Poin-poin utama:

  • Kebocoran gorutin terus menumpuk; pantau dengan runtime.NumGoroutine()
  • goleak dalam pengujian menangkap kebocoran gorutin secara otomatis
  • Selalu berikan jalur keluar untuk gorutin: konteks, kanal selesai, atau masukan yang ditutup
  • time.After dalam perulangan menyebabkan kebocoran pewaktu; gunakan NewTimer+Reset

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Deteksi Kebocoran dan Pembatalan” gratis?

Ya — teks lengkap “Deteksi Kebocoran dan Pembatalan” 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 “Deteksi Kebocoran dan Pembatalan”?

Memastikan goroutine berhenti dan mencegah kebocoran 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 4 dari 4.

Berapa lama pelajaran “Deteksi Kebocoran dan Pembatalan” 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. Pola Pipeline dan Tahap
  2. errgroup untuk Penanganan Error Konkuren
  3. Pola Semaphore
  4. Deteksi Kebocoran dan Pembatalan
← Kembali ke Go Academy