日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

go errgroup 用法示例

發布時間:2024/2/28 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 用法示例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。