pemrograman

Mengenal WaitGroup Pada Golang

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.

comments powered by Disqus