0Pricing
Go Academy · Pelajaran

errgroup untuk Penanganan Error Konkuren

golang.org/x/sync/errgroup dalam praktik

errgroup untuk Penanganan Error Konkuren 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.

Masalah goroutine dan galat

Menjalankan goroutine dengan go func() membuang nilai yang dikembalikan, termasuk galat. Anda memerlukan mekanisme tambahan (saluran, WaitGroup) untuk mengumpulkannya. errgroup menyederhanakan hal ini.

golang.org/x/sync/errgroup

errgroup.Group menjalankan goroutine dan mengumpulkan galat. Wait() memblokir hingga semua goroutine selesai, lalu mengembalikan galat pertama yang bukan nil.

var g errgroup.Group
g.Go(func() error { return fetchUsers() })
g.Go(func() error { return fetchOrders() })
if err := g.Wait(); err != nil {
    log.Fatal(err)
}

errgroup.WithContext

WithContext mengembalikan sebuah grup dan konteks turunan. Konteks tersebut dibatalkan ketika goroutine pertama mengembalikan galat, sehingga pekerjaan yang tersisa berhenti.

g, ctx := errgroup.WithContext(context.Background())
g.Go(func() error { return doWork(ctx) })
g.Go(func() error { return doOtherWork(ctx) })
err := g.Wait()

Mengumpulkan hasil bersama galat

errgroup tidak mengumpulkan hasil, hanya galat. Tangkap hasil dalam slice yang telah dialokasikan sebelumnya dan akses berdasarkan indeks untuk menghindari sinkronisasi:

results := make([]Result, len(items))
for i, item := range items {
    i, item := i, item
    g.Go(func() error {
        r, err := process(ctx, item)
        if err != nil { return err }
        results[i] = r
        return nil
    })
}
if err := g.Wait(); err != nil { return err }

g.SetLimit (Go 1.20+)

g.SetLimit(n) membatasi jumlah goroutine yang berjalan secara konkuren — berfungsi sebagai semafor sebaris tanpa saluran terpisah.

g.SetLimit(10) // at most 10 goroutines at once
for _, item := range items {
    g.Go(func() error { return process(item) })
}

g.TryGo

g.TryGo(f) hanya memulai goroutine jika batasnya (yang ditetapkan oleh SetLimit) memungkinkan. Mengembalikan false jika goroutine tidak dimulai.

Hanya galat pertama yang dikembalikan

errgroup hanya mengembalikan galat pertama. Jika Anda memerlukan semua galat, kumpulkan galat tersebut dalam slice yang dilindungi mutex di dalam setiap goroutine.

var mu sync.Mutex
var errs []error
g.Go(func() error {
    if err := doWork(); err != nil {
        mu.Lock(); errs = append(errs, err); mu.Unlock()
    }
    return nil
})

Perbedaan dari sync.WaitGroup

WaitGroup melacak penyelesaian; errgroup melacak penyelesaian DAN mengumpulkan galat. Utamakan errgroup jika kegagalan goroutine mana pun harus dilaporkan.

Propagasi pembatalan konteks

Ketika errgroup.WithContext digunakan, sinyal pembatalan dari konteks turunan memerintahkan semua goroutine lain untuk berhenti — serupa dengan semantik pembatalan saat terjadi galat pertama.

Menguji kode errgroup

Dalam pengujian, berikan konteks dengan WithTimeout untuk memastikan grup tidak berjalan selamanya jika sebuah goroutine macet.

ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
g, ctx := errgroup.WithContext(ctx)

Alternatif semafor

Sebelum SetLimit (Go < 1.20), gunakan saluran berbuffer sebagai semafor di dalam goroutine individual untuk mencapai efek yang sama.

Pemeriksaan Cepat

Apa yang dikembalikan oleh errgroup.WithContext yang tidak dikembalikan oleh errgroup.Group biasa?

Rangkuman: errgroup

Poin penting:

  • g.Go(func() error) — jalankan dan kumpulkan galat pertama
  • g.Wait() — memblokir hingga semua selesai; mengembalikan galat pertama
  • WithContext — konteks dibatalkan saat terjadi galat pertama
  • g.SetLimit(n) — membatasi goroutine konkuren (Go 1.20+)

Pertanyaan yang Sering Diajukan

Apakah pelajaran “errgroup untuk Penanganan Error Konkuren” gratis?

Ya — teks lengkap “errgroup untuk Penanganan Error Konkuren” 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 “errgroup untuk Penanganan Error Konkuren”?

golang.org/x/sync/errgroup dalam praktik 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 “errgroup untuk Penanganan Error Konkuren” 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