Menunggu Goroutine Selesai dengan WaitGroup

Halo teman-teman! Kita ketemu lagi di seri Golang Goroutine.
Setelah sebelumnya kita belajar tentang Race Condition, kali ini kita akan membahas cara menunggu semua Goroutine selesai dengan benar menggunakan sync.WaitGroup.
Ini topik penting supaya program kita tidak berakhir sebelum semua goroutine selesai bekerja.
Masalah dengan time.Sleep
Sebelumnya, kita sering menggunakan time.Sleep seperti ini:
time.Sleep(1 * time.Second)Tujuannya supaya Goroutine selesai sebelum program berakhir. Tapi ini bukan cara yang baik, karena:
* Tidak presisi: kita tidak tahu pasti kapan semua goroutine selesai.
* Membuat program jadi tidak efisien (kadang menunggu terlalu lama, kadang kurang lama).
* Sulit diatur untuk program yang kompleks.
Solusinya adalah WaitGroup
Apa Itu WaitGroup?
sync.WaitGroup adalah fitur dari package sync yang berguna untuk:
* Mendaftarkan jumlah goroutine yang harus ditunggu.
* Menunggu sampai semua goroutine selesai.
> Intinya, WaitGroup seperti "penjaga pintu" yang baru membolehkan program lanjut kalau semua pekerjaan sudah selesai.
Cara Menggunakan WaitGroup
Berikut langkah-langkahnya:
- Tambah jumlah pekerjaan dengan
Add(n).
- Panggil
Done()di setiap goroutine setelah selesai.
- Panggil
Wait()di program utama untuk menunggu semua selesai.
Contoh Penggunaan WaitGroup
Langsung aja ke contoh unit test-nya:
package goroutine_test
import (
"fmt"
"sync"
"testing"
)
func RunTask(number int, wg *sync.WaitGroup) {
defer wg.Done() // pastikan Done dipanggil saat fungsi selesai
fmt.Println("Running task", number)
}
func TestWaitGroup(t *testing.T) {
var wg sync.WaitGroup
for i := 1; i <= 5; i++ {
wg.Add(1) // Tambahkan 1 pekerjaan
go RunTask(i, &wg)
}
wg.Wait() // Tunggu semua goroutine selesai
fmt.Println("All tasks completed")
}🧠Penjelasan:
* wg.Add(1): memberitahu WaitGroup ada 1 goroutine baru yang harus ditunggu.
* defer wg.Done(): saat tugas selesai, goroutine ini memberitahu WaitGroup bahwa dia sudah selesai.
* wg.Wait(): program akan berhenti di sini dan menunggu semua goroutine yang terdaftar selesai.
Hasilnya lebih presisi, lebih aman, dan tidak perlu lagi tebak-tebakan sleep berapa lama!
Catatan Penting
* Selalu pastikan wg.Done() dipanggil tepat satu kali untuk setiap wg.Add(1).
* Biasanya kita pakai defer wg.Done() di dalam goroutine untuk menghindari lupa memanggilnya.
* WaitGroup tidak boleh di-reuse setelah semua pekerjaannya selesai.
Kesimpulan
Hari ini kita sudah belajar:
* Masalah menggunakan time.Sleep
* Apa itu sync.WaitGroup
* Cara menggunakan WaitGroup dengan benar
* Contoh nyata menunggu goroutine selesai
Dengan WaitGroup, program kamu akan jadi lebih profesional, presisi, dan lebih mudah dirawat.
Apa Selanjutnya?
Di Golang Goroutine #5, kita akan belajar:
* Apa itu Buffered Channel
* Bagaimana Buffered Channel bekerja
* Kapan sebaiknya menggunakan Buffered Channel untuk meningkatkan performa
Sampai ketemu di tutorial berikutnya ya! 🚀
Article Series
Golang Goroutine
Lanjutkan membaca seri ini untuk melihat perjalanan lengkapnya.
- 1Membuat Goroutine di Golang24 Apr 20252 min read
- 2Pengenalan Channel di Golang28 Apr 20253 min read
- 3Race Condition dan Cara Menghindarinya di Golang28 Apr 20253 min read
- 4Menunggu Goroutine Selesai dengan WaitGroup29 Apr 20252 min readCurrent article
- 5Memahami Buffered Channel di Golang29 Apr 20253 min read
- 6Mengenal Select Statement di Golang29 Apr 20252 min read
- 7Memahami Channel Direction di Golang29 Apr 20252 min read
- 8Best Practice dan Kapan Sebaiknya Tidak Menggunakan Goroutine29 Apr 20252 min read