網頁

2024/3/20

Golang WaitGroup用法

Go的sync.WaitGroup可用來等待所有的goroutine都執行結束。


範例

下面使用多個goroutine來處理多筆訊息,並利用WaitGroup等待所有的goroutine結束後才結束main程式。

WaitGroup的方法說明:

  • WaitGroup.Add - 增加WaitGroup的goroutine計數,每多一個goroutine則加一。
  • WaitGroup.Done - 扣除WaitGroup的goroutine計數,當一個goroutine結束時減一。
  • WaitGroup.Wait - 當WaitGroup計數為0之前會進行阻塞;當WaitGroup計數變為0,代表所有的goroutine都執行結束,便會解除阻塞讓程式繼續往下執行。

main.go

package main

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

func main() {
    msgs := genMessages() // 產生多筆訊息

    var wg sync.WaitGroup // 建立WaitGroup物件

    // 每一筆訊息都由一個goroutine處理
    for _, msg := range msgs {
        wg.Add(1) // 每多一個goroutine,就在WaitGroup計數加一
        go func(msg string) {
            defer wg.Done()             // 當一個goroutine結束,就從WaitGroup計數扣除
            time.Sleep(time.Second * 1) // 模擬處理每筆訊息要耗費的時間
            fmt.Println(msg)
        }(msg)
    }
    wg.Wait() // 當WaitGroup的計數為0之前,會阻塞。
}

func genMessages() []string {
    msgs := make([]string, 0)
    for i := 0; i < 10; i++ {
        msgs = append(msgs, fmt.Sprintf("message %d", i))
    }
    return msgs
}

github



沒有留言:

張貼留言