Perkenalan
Waitgroup adalah fitur dari Golang yang digunakan untuk menunggu sebuah proses yang dilakukan oleh beberapa goroutine. Hal ini dilakukan dikarenakan kita perlu melakukan proses secara bersamaan tetapi ketika akan melanjutkan proses selanjutnya kita membutuhkan data dari hasil sebelumnya akhirnya kita harus menunggu terlebih dahulu dari proses sebelumnya untuk mendapatkan datanya.
Misalkan, kita ingin menjalankan beberapa proses menggunakan goroutine
, tetapi kita ingin semua proses selesai terlebih dahulu sebelum aplikasi selesai, maka kasus ini kita bisa gunakan Waitgroup
. Dalam hal ini kita akan menandai proses-proses yang sedang berjalan menggunakan goroutine biasanya dengan perintah Add(int)
. Setelah proses selesai maka kita akan memanggil method Done()
dan untuk menunggu semua proses selesai kita bisa menggunakan Wait()
.
Implementasi sync.WaitGroup
Kita akan mencoba simulasikan bagaimana penggunaan WaitGroup
ini pada kode golang, hal ini kita akan menggunakan goroutine yang dijalankan bersamaan menggunakan perulangan sebanyak 100 kali. Lebih detailnya kita lihat kode dibawah ini.
func HelloWorld(wg *sync.WaitGroup) {
defer wg.Done()
wg.Add(1)
fmt.Println("Hello")
time.Sleep(1 * time.Second)
}
func main() {
var wg sync.WaitGroup
for i := 0; i < 100; i++ {
go HelloWorld(&wg)
}
wg.Wait()
fmt.Println("Finish")
}
Dari kode diatas, jika kita sudah jalankan maka akan mencetak Hello
sebanyak 100 kali tetapi prosesnya begitu cepat, karena kita menggunakan goroutine
padahal proses dari fungsi dari HelloWorld
ini memiliki waktu 1 detik untuk melakukan proses. Hal ini membuktikan bahwa penggunaan WaitGroup
ini akan menunggu proses mana yg paling lama dengan panggil fungsi Wait()
lalu jika semua telah selesai program akan berakhir.
Hasil program ketika sudah dijalankan
Hello
Hello
...
...
Hello
Hello
Finish
Kesimpulan
Penggunaan WaitGroup
ini biasanya digunakan untuk proses-proses yang ingin berjalan secara bersamaan dengan menggunakan goroutine tetapi semua proses tersebut kita ingin menunggu hasilnya sampai selesai, dikarenakan proses tersebut hasil datanya dibutuhkan untuk proses selanjutnya. Pastikan WaitGroup
yang sedangan berjalan ditutup dengan fungsi wg.Done()
agar proses tidak terus menunggu sehingga mengakibatkan
Deadlock dan cara mengatasinya pada program kita.