[note] Go concurrency
此篇為各筆記之整理,非原創內容,資料來源可見下方連結與文後參考資料:
- Anatomy of Channels in Go - Concurrency in Go @ rungo
- 在 Go 語言內管理 Concurrency 的三種方式 @ appleboy
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)
}