如何接受併發 goroutine 的錯誤

實現類似 errgroup 的功能

其實比較簡單了,就是在併發 goroutine 的時候,我們根據初始化的 goroutine 的數量初始化一個chan error類型的 chan,然後每個 goroutine 在遇到錯誤時候,將 error 寫入 chan,這樣主 goroutine 通過 for range 去遍歷這個 chan 就行了。

代碼

package main

import (
 "errors"
 "fmt"
 "runtime"
 "sync"
)

func main() {
 ch := make(chan error, 3)
 wg := sync.WaitGroup{}
 wg.Add(3)
 go func() {
  defer wg.Done()
  ch <- errors.New("err1")
 }()
 go func() {
  defer wg.Done()
  ch <- errors.New("err2")
 }()
 go func() {
  defer wg.Done()
  ch <- errors.New("err3")
 }()

 fmt.Println(runtime.NumGoroutine(), len(ch), cap(ch))
 wg.Wait()
 close(ch)
 for err := range ch {
  fmt.Println(err)
 }
 fmt.Println(runtime.NumGoroutine(), len(ch), cap(ch))
}

結果

小結

還有很多方式可以實現這個功能,不過最常見的還是在 waitgroup 中通過 chan 收集 error,其它方式大家下去可以自行探索。

堆棧 future 使很多處於迷茫階段的 coder 能從這裏找到光明,堆棧創世,功在當代,利在千秋

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/uRqLmZEmtxW15C3_MVTw-A