sync.WaitGroup
Menunggu sekumpulan goroutine
sync.WaitGroup 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.
Tujuan
sync.WaitGroup menunggu sekumpulan goroutine selesai. Goroutine utama memanggil Add untuk menetapkan jumlahnya, setiap goroutine memanggil Done setelah selesai, dan Wait memblokir hingga jumlahnya mencapai nol.
Penggunaan dasar
Panggil Add sebelum menjalankan setiap goroutine; panggil Done di akhir setiap goroutine (dengan defer); panggil Wait setelah semua goroutine dijalankan.
var wg sync.WaitGroup
for _, item := range items {
wg.Add(1)
go func(v Item) {
defer wg.Done()
process(v)
}(item)
}
wg.Wait()Add harus dilakukan sebelum goroutine dimulai
Panggil wg.Add(1) sebelum go func(), jangan pernah di dalam goroutine. Jika tidak, Wait mungkin selesai sebelum goroutine mendaftarkan dirinya.
Kesalahan umum: penangkapan variabel perulangan
Teruskan variabel perulangan sebagai argumen ke fungsi goroutine, bukan melalui closure, agar semua goroutine tidak berbagi variabel yang sama.
for _, v := range items {
wg.Add(1)
go func(item Item) { // correct: copy
defer wg.Done()
process(item)
}(v)
}Menggunakan kembali WaitGroup
WaitGroup dapat digunakan kembali setelah Wait selesai, tetapi hanya jika semua pemanggilan Done sebelumnya telah selesai. Jangan menggunakannya kembali secara bersamaan dengan pemanggilan Done yang masih berlangsung.
WaitGroup dengan hasil
WaitGroup tidak mengumpulkan hasil—gabungkan dengan kanal atau irisan (dengan mutex) untuk mengumpulkan keluaran dari goroutine.
results := make([]Result, len(items))
for i, item := range items {
wg.Add(1)
go func(idx int, v Item) {
defer wg.Done()
results[idx] = process(v)
}(i, item)
}
wg.Wait()Add dengan jumlah sekaligus
Anda dapat meneruskan jumlah total ke satu pemanggilan Add sebelum perulangan, yang sedikit lebih efisien daripada satu Add untuk setiap goroutine.
wg.Add(len(items))
for _, item := range items {
go func(v Item) { defer wg.Done(); process(v) }(item)
}Jangan menyalin WaitGroup
Seperti Mutex, WaitGroup tidak boleh disalin setelah pertama kali digunakan. Teruskan dengan pointer atau sematkan dalam struct yang diteruskan dengan pointer.
WaitGroup dibandingkan dengan errgroup
golang.org/x/sync/errgroup membungkus WaitGroup dan menambahkan propagasi kesalahan. Pilih errgroup jika kegagalan salah satu goroutine harus menghentikan goroutine lainnya.
Menggabungkan dengan konteks
Gunakan errgroup.WithContext untuk mendapatkan semantik WaitGroup sekaligus konteks yang dibatalkan saat kesalahan pertama terjadi, sehingga semua goroutine dapat dihentikan dengan rapi.
g, ctx := errgroup.WithContext(context.Background())
g.Go(func() error { return doWork(ctx) })
if err := g.Wait(); err != nil { log.Fatal(err) }Nilai nol dapat digunakan
Nilai nol sync.WaitGroup siap digunakan—tidak memerlukan konstruktor. Cukup deklarasikan lalu panggil Add.
Pemeriksaan singkat
Apa yang terjadi jika Anda memanggil wg.Add(1) di dalam goroutine, bukan sebelum menjalankannya?
Ringkasan: sync.WaitGroup
Poin penting:
- Add sebelum menjalankan goroutine; Done dengan defer di dalam goroutine
- Wait memblokir hingga jumlahnya mencapai nol
- Jangan pernah menyalin; jangan pernah memanggil Add di dalam goroutine
- Gunakan errgroup untuk propagasi kesalahan
Pertanyaan yang Sering Diajukan
Apakah pelajaran “sync.WaitGroup” gratis?
Ya — teks lengkap “sync.WaitGroup” 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 “sync.WaitGroup”?
Menunggu sekumpulan goroutine 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 “sync.WaitGroup” 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.