iT邦幫忙

2021 iThome 鐵人賽

DAY 9
0
自我挑戰組

golang 後端菜雞工程師學習雜記系列 第 18

Day 18 wait group 的使用

Wait group

wait group 通常用來等待一組 goroutine 完成工作。
wait group 維護了一個 counter,並且依據 counter 的數字來控制 goroutine。透過三個操作來控制

  • Add(delta int): 將 counter 加 delta。如果 counter 變為 0,被 Wait() 所擋住的 goroutine 將會放行。
  • Done(): 將 conter 減 1,其實它的實作就是 Add(-1)。
  • Wait(): 一直等待,直到 counter 變為 0。

以下給一個程式的例子,定義一個 worker,並且讓五個 worker 做事,五個 worker 做完事情後,counter 一定為 0,這時正在 wait 的 main goroutine 才會繼續執行。

func worker(id int) {
    fmt.Printf("Worker %d starting\n", id)
    time.Sleep(time.Second)
    fmt.Printf("Worker %d done\n", id)
}
func main() {
    var wg sync.WaitGroup
    for i := 1; i <= 5; i++ {
        wg.Add(1)
        i := i
        go func() {
            defer wg.Done()
            worker(i)
        }()
    }
    wg.Wait()
}

 在 go 裏很常使用到錯誤處理,但是 wait group 本身並沒有支援錯誤處理流程,自己設計錯誤處理又很容易犯錯。errgroup package 就可以解決這個問題。而且 errgroup 同時支援 context 的做法,下一次就來寫 errgroup 吧

Reference


上一篇
Day 17 讀 Go Concurrency Patterns - Rob Pike IV
系列文
golang 後端菜雞工程師學習雜記18
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言