Menunggu Beberapa Goroutine Selesai Dengan WaitGroup

Goroutine sangat berguna untuk menjalan proses secara asynchronous. Kita juga bisa menggunakan beberapa goroutine untuk menjalankan beberapa proses dalam waktu bersamaan. Tapi bagaimana kalau kita ingin menunggu goroutine tersebut selesai sebelum melanjutkan ke proses berikutnya? Kita dapat menggunakan WaitGroup untuk mengunggu goroutine selesai dijalankan.

Apa itu WaitGroup

WaitGroup adalah struct bawaan Go yang ada di package sync. WaitGroup dapat menunggu beberapa goroutine selesai. Ayo kita lihat bagaimana cara WaitGroup di Go.

Bagaimana cara menggunakan WaitGroup

Misalkan kita mempunyai dua fungsi seperti ini:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
func myFunc() {
    println("myFunc is running")
    time.Sleep(5 * time.Second)
    println("myFunc is done")
}

func myOtherFunc() {
    println("myOtherFunc is running")
    time.Sleep(4 * time.Second)
    println("myOtherFunc is done")
}

Kedua fungsi ini ingin dijalankan pada waktu bersamaan kemudian menunggu sampai kedua fungsi tersebut selesai, baru kemudian lanjut ke proses berikutnya. Kita bisa menggunakan WaitGroup untuk melakukan hal tersebut. Lihat contoh dibawah ini tentang cara menggunakan WaitGroup.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import (
    "sync"
    "time"
)

func main() {
    var wg sync.WaitGroup

    wg.Add(1)
    go func() {
        myFunc()
        wg.Done()
    }()

    wg.Add(1)
    go func() {
        myOtherFunc()
        wg.Done()
    }()

    wg.Wait()
    
    println("continue the process...")
}

Pertama-tama, kita men-declare sebuah WaitGroup di line 7. Lalu untuk setiap goroutine, kita perlu memanggil wg.Add(1) sebelum menjalankan proses pada goroutine, dan wg.Done() setelah proses tersebut selesai. Jangan lupa memanggil wg.Done(), kalau lupa programmu bisa menunggu selamanya. Kemudian kita gunakan wg.Wait() untuk menunggu semua proses selesai.

Kesimpulan

Ada banyak cara untuk menunggu goroutine selesai dijalankan. Salah satunya adalah menggunakan WaitGroup. Ini adalah cara menggunakan WaitGroup yang sederhana. Kalau kamu ada pertanyaan atau saran, bisa tulis komentar di bawah.

go 

See also