Concurrency - WaitGroup

WaitGroup digunakan untuk menunggu sampai beberapa collection dari goroutine selesai berjalan. Jadi WaitGroup digunakan untuk blocking statement selanjutnya sampai proses goroutine selesai.

Misalnya kita mempunyai 3 goroutine yang akan dijalankan pada fungsi main . Maka fungsi main akan menunggu sampai ketiga goroutine selesai dieksekusi barulah melanjutkan statement berikutnya atau berhenti.

Untuk menggunakan WaitGroup, kita harus menggunakan package bawaan Go yaitu sync.WaitGroup .

Mari kita lihat contoh penggunaan WaitGroup:

package main

import (  
    "fmt"
    "sync"
    "time"
)

func process(i int, wg *sync.WaitGroup) {  
    fmt.Println("started Goroutine ", i)
    time.Sleep(2 * time.Second)
    fmt.Printf("Goroutine %d ended\n", i)
    wg.Done()
}

func main() {  
    no := 3
    var wg sync.WaitGroup
    for i := 0; i < no; i++ {
        wg.Add(1)
        go process(i, &wg)
    }
    wg.Wait()
    fmt.Println("All go routines finished executing")
}

WaitGroup adalah sebuah tipe data. Pada kode di atas kita membuat zero value variabel dengan tipe WaitGroup pada line 18. Cara kerja WaitGroup adalah menggunakan counter. Ketika kita menjalankan fungsi Add dari WaitGroup and mengisi nilai argumen dengan nilai int, maka counter dari WaitGroup akan naik secara incremental dari nilai awal the yang kita isi pada argumen Add yaitu 1 . Lalu cara untuk menurunkan counter secara decrement adalah dengan memanggil fungsi Done() dari WaitGroup. Fungsi Wait() akan memblocking Goroutine yang dipanggil sampai counter bernilai 0 atau zero.

Last updated