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