go errgroup 用法示例
生活随笔
收集整理的這篇文章主要介紹了
go errgroup 用法示例
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Go團隊在實驗倉庫中添加了一個名為sync.errgroup的新軟件包。 sync.ErrGroup再sync.WaitGroup功能的基礎上,增加了錯誤傳遞,以及在發生不可恢復的錯誤時取消整個goroutine集合,或者等待超時
其中包含的函數如下:
func WithContext(ctx context.Context) (*Group, context.Context)
?
Go()方法不僅允許你傳一個匿名的函數,而且還能捕獲錯誤信息,你只要像這樣返回一個錯誤 return err,這使開發者使用goroutines時開發效率顯著提高
func (g *Group) Go(f func() error)
func (g *Group) Wait() error
示例1(代碼中已有詳細的注釋):
package main import ("fmt""golang.org/x/sync/errgroup""errors" ) func main() {group := new(errgroup.Group)nums := []int{-1, 0, 1}for _, num := range nums {tempNum := num // 子協程中若直接訪問num,則可能是同一個變量,所以要用臨時變量// 子協程group.Go(func() error {if tempNum < 0 {return errors.New("tempNum < 0 !!!")}fmt.Println("tempNum:",tempNum)return nil})}// 捕獲errif err := group.Wait(); err != nil {fmt.Println("Get errors: ", err)}else {fmt.Println("Get all num successfully!")} }執行結果如下圖(正常捕獲到了err):
示例2(代碼中已有詳細的注釋):
package main import ("fmt""time"xContext "golang.org/x/net/context""golang.org/x/sync/errgroup" ) func main() {ctx, cancel := xContext.WithCancel(xContext.Background())group, errCtx := errgroup.WithContext(ctx)for index := 0; index < 3; index++ {indexTemp := index // 子協程中若直接訪問index,則可能是同一個變量,所以要用臨時變量// 新建子協程group.Go(func() error {fmt.Printf("indexTemp=%d \n", indexTemp)if indexTemp == 0 {fmt.Println("indexTemp == 0 start ")fmt.Println("indexTemp == 0 end")} else if indexTemp == 1 {fmt.Println("indexTemp == 1 start")//這里一般都是某個協程發生異常之后,調用cancel()//這樣別的協程就可以通過errCtx獲取到err信息,以便決定是否需要取消后續操作cancel()fmt.Println("indexTemp == 1 err ")} else if indexTemp == 2 {fmt.Println("indexTemp == 2 begin")// 休眠1秒,用于捕獲子協程2的出錯time.Sleep(1 * time.Second)//檢查 其他協程已經發生錯誤,如果已經發生異常,則不再執行下面的代碼err := CheckGoroutineErr(errCtx)if err != nil {return err}fmt.Println("indexTemp == 2 end ")}return nil})}// 捕獲errerr := group.Wait()if err == nil {fmt.Println("都完成了")} else {fmt.Printf("get error:%v", err)} }//校驗是否有協程已發生錯誤 func CheckGoroutineErr(errContext xContext.Context) error {select {case <-errContext.Done():return errContext.Err()default:return nil} }執行結果如下圖(捕獲到了cancel):
?
總結
以上是生活随笔為你收集整理的go errgroup 用法示例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: go WaitGroup 简单示例
- 下一篇: go WaitGroup的坑