跳至主要内容

[note] Go concurrency

此篇為各筆記之整理,非原創內容,資料來源可見下方連結與文後參考資料:

TL;DR

  • WaitGroup 的用法適合用在需要將單一任務拆成許多次任務,待所有任務完成後才繼續執行。

sync.WaitGroup

使用 sync.WaitGroup 提供的:

  • wg.Add() 可以設定要等待的次數
  • wg.Done() 會增加完成次數
  • wg.Wait() 會等待所有 WaitGroup 完成後才往後執行
// 程式來源:https://blog.wu-boy.com/2020/08/three-ways-to-manage-concurrency-in-go/
func main() {
var wg sync.WaitGroup // // 建立 WaitGroup
wg.Add(3) // 要等待三次 done
i := 0

go func() {
defer wg.Done() // 執行 Done
time.Sleep(1 * time.Second)
fmt.Println("goroutine 1 done")
i++
}()

go func() {
defer wg.Done() // 執行 Done
time.Sleep(2 * time.Second)
fmt.Println("goroutine 2 done")
i++
}()

go func() {
defer wg.Done() // 執行 Done
time.Sleep(3 * time.Second)
fmt.Println("goroutine 3 done")
}()

wg.Wait() // 等到所有 Done 都完成才繼續往後執行
fmt.Println("all goroutine done")
fmt.Println(i)
}