如何接受併發 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