Belajar Golang #28 : Menggunakan WaitGroup

Tutorial golang yang meneruskan tentang pembahasan mengenai goroutine. Pembahas kali ini akan membahas mengenai apa itu waitGroup dan cara menggunakan WaitGroup di dalam bahasa Program Go.

Sudah di ketahui bersama bahwa golang dapat melakukan proses yang bersamaan yaitu Concurrency dan Parallelism.

Apa itu WaitGroup ?

Jika di artikan bahasa Indonesia Wait dan Group bisa di artikan menunggu kelompok. Nah kelompok yang di maksud yaitu gorotuine. Sehingga WaitGroup adalah mekanisme digolang yang berfungsi untuk melakukan sinkronisasi antara goroutine. Beda dengan Channel ya, kalau channel digunakan untuk komunikasi antar goroutine.

Masih ingat mengenai ketika awal belajar goroutine, dimana kita menggunakan fungsi sleep untuk menunggu goroutine.

Nah dengan mneggunakan waitgroup kita tidak perlu lagi menggakan fungsi sleep.

Berikut ini manfaat menggunakan goroutine.

  • Menambahkan Goroutine yang jalan.
  • Menunggu / Menunda Goroutine Jalan.
  • Dan mengakiri Goroutine yang jalan.

Kenapa harus menggunakan WaitGroup ?

Ketika kita ingin melakukan proses secara concurency maka harus satu persatu proses selesai di dalam goroutine, entah goroutine itu berjalan berapa kali. Maka solusi pertama mengunakan sleep. Namun dengan menggunakan sleed sama saja kita memaksakan goroutine berhenti dalam waktu tertentu. Hal ini tentu akan membuat program lebih lambat.

Sebagai contoh di bawah ini program yang menerapkan penggunaan sleep untuk menggunakan goroutine.

main.go

Hasilnya :

Belajar Golang #28 : Menggunakan WaitGroup

Jika di lihat dari hasil terhadap nilai sudah benar, namun jika kita lihat dari penggunaan kode yang benar dan kecepatan data hal ini tidak di rekomendasikan. Karena Data di cetak dengan jeda waktu 250 mili detik.

Sekarang jika udah mengetahui penggunaan di atas dan di rasa kurang baik maka saat menggunakan waitGroup.

Cara menggunakan WaitGroup

Penggunaan kode WaitGroup tidak lah rumit, ada 3 hal penting yang perlu di ketahui, yaitu :

  • Add(), digunakan untuk menambah goroutine yang jalan.
  • Wait(), digunakan untuk menunggu proses berjalan.
  • Done(), digunakan untuk menandai bahwa semua goroutine sudah selesai.

Yuk langsung saja kita bikin contohnya.

Contoh kode berikut ini mengadopsi dari kode sebelumnya, namun di rubah ke bentuk WaitGroup.

main.go

Hasilnya :

Belajar Golang #28 : Menggunakan WaitGroup

Apakah anda bingung melihat sintaks kode di atas ?

Tenang tidak usah bingung dan kwatir, ketika belajar ini jangan punya angan terhadap channel. Karena nanti nya dalam proses nyata biasa menggabungkan kedua nya yaitu channel dan WaitGroup.

Perhatikan kode di atas, terdapat data dengan tipe slice yang berisi string. Selain itu juga terdapat variable wg yang digunakan untuk mendeklarasikan WaitGroup.

Lalu, slice string di lakukan perulangan, dimana setiap satu putaran di tambahkan wg.Add(1), artinya menambahkan 1 proses yang berjalan. Sehingga jumlah nya yang jalan sejumlah perulangan yang di lakukan.

Sebenarnya pengguunaan wg.Add(1) tidak harus di letakkan di perulangan, bisa saja di deklarasikan di awal namun kita harus tahu berapa jumlah goroutine yang jalan. Jika melihat kode di atas pasti sudah jelas goroutine akan jalan sejumlah data yang ada di slice.

Di dalam fungsi cetak yang di jalankan sebagai gorotuine terdapat sintaks wg.done(), artinya proses selesai pada satu kali jalan. Artinya fungsi cetak akan melakukan fungsi finsih(done) sebanyak jumlah goroutine.

Selain itu di setelah perulangan pada fungsi main terdapat sintaks wg.wait(), digunakan untuk menunggu goroutine yang jalan.

Cukup mudah bukan ?

Perpaduan antara WaitGroup dengan Channel

Saya akan berikan contoh dan membuat kita semua mengerti cara menggunakan WaitGroup di padu dengan channel.

Langsung saja kita buat kode golangnya.

main.go

Perhatikan kode di atas, terdapat chanel baru yang berisi string di tandai dengan variable channelData. Lalu di function cetak() digunakan untuk memberi nama isi dari channel.

Baca Juga : Memahami penggunaan Channel

Untuk mencetak channel dapat menggunakan sebuah fungsi goroutine seperti contoh di atas maupun langsung melakukan perulangan terhadap channel.

Perlu di ketaui bahwa channel di atas di lakukan secara un-buffered(blocking), untuk membuat channel menjadi buffer anda dapat mengubah sintaks :

Menjadi :

Contoh di atas saya memberikan nilai buffer 5.

Lebih jauh tentang Goroutine, Channel dan WaitGroup

Untuk menentukan apakah program yang kita buat menggunakan goroutine berjalan secara Concurrency atau Parallelism kita bisa mengatur core yang ingin di jalankan.

Secara default penggunaan core komputer di pake semuanya. Nah Kita bisa mengatur jumlah core yang jalan, jumlah core yang di atur akan menentukan sejauh mana program golang berjalan dalam hal kecepatan.

Untuk mengatur jumlah core yang di jalankan dapat menggunakan contoh kode :

Angka 2 digunakan untuk menentukan jumlah core yang di pakai sebagai runtime bukan karnel.

Contohnya saya akan buat program secara Parallelism di bawah ini.

Hasilnya :

Belajar Golang #28 : Menggunakan WaitGroup

Terdapat 2 goroutine yang jalan, dimana setiap goroutine di jalankan sekali. Saya mencoba melakukan 2 kali menjalankan kode program golang. Dan hasilnya pun berbeda, dimana yang percobaan pertama goroutine yang pertama dulu yang di cetak, sedangkan percobaan kedua goroutine kedua yang di cetak.

Jumlah Core di atas di atur sejumlah 2. Artinya 2 goroutine tersebut berjalan dalam satu kali waktu.

Artikel sebelumnya

Sekian tutorial mengenai WaitGroup di bahasa program Golang. Terima Kasih.

Leave a Reply