最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go語言擴展原語之ErrGroup的用法詳解

 更新時間:2023年07月18日 11:49:11   作者:碼一行  
除標準庫中提供的同步原語外,Go語言還在子倉庫sync中提供了4種擴展原語,本文主要為大家介紹的是其中的golang/sync/errgroup.Group,感興趣的小伙伴可以了解一下

概述

除標準庫中提供的同步原語外,Go語言還在子倉庫sync中提供了4種擴展原語:

  • golang/sync/errgroup.Group
  • golang/sync/semaphore.Weighted
  • golang/sync/singleflight.Group
  • golang/sync/syncmap.Map

其中 golang/sync/syncmap.MapGo1.9 中移植到了標準庫中。

接下來介紹Go語言在擴展包中提供的3種同步原語 —— golang/sync/errgroup.Group

ErrGroup

golang/sync/errgroup.Group 為我們在一組 Goroutine 中提供了同步、錯誤傳播以及上下文取消功能,我們可以使用這種方式并行獲取網(wǎng)頁數(shù)據(jù):

var g errgroup.Group
var urls = []string{
    "http://www.golang.org",
    "http://www.google.com"
}
for i := range urls {
    url := urls[i]
    g.Go(func() error {
        resp, err := http.Get(url)
        if err == nil {
            resp.Body.Close()
        }
        return err
    })
}
if err := g.Wait(); err == nil {
    fmt.Println("Successfully fetched all URLs.")
}

golang/sync/errgroup.Group.Go 方法能夠創(chuàng)建一個 Goroutine 并在其中執(zhí)行傳入的函數(shù),而 golang/sync/errgroup.Group.Wait 會等待所有 Goroutine 返回,該方法的不同返回結(jié)果有不同的含義:

  • 如果返回錯誤 —— 這一組 Goroutine 最少返回一個錯誤
  • 如果返回空值 —— 所有 Goroutine 都成功執(zhí)行

結(jié)構(gòu)體

golang/sync/errgroup.Group 結(jié)構(gòu)體有 3 個比較重要的部分組成

  • cancel —— 創(chuàng)建 context.Context 時返回的取消函數(shù),用于在多個 Goroutine 之間同步取消信號
  • wg —— 用于等待一組 Goroutine 完成子任務(wù)的同步原語
  • errOnce —— 用于保證只接收一個子任務(wù)返回的錯誤
type Group struct {
    cancel func()
    wg sync.WaitGroup
    errOnce sync.Once
    err     error
}

這些字段共同組成了 golang/sync/errgroup.Group 結(jié)構(gòu)體并為我提供同步、錯誤傳播以及上下文取消等功能。

接口

我們能通過 golang/sync/errgroup.WithContext 構(gòu)造器創(chuàng)新的 golang/sync/errgroup.Group 結(jié)構(gòu)體:

func WithContext(ctx context.Context) (*Group, context.Context) {
    ctx, cancel := context.WithCancel(ctx)
    return &Group{cancel: cancel}, ctx
}

運行新的并行子任務(wù)需要使用 golang/sync/errgroup.Group.Go 方法,這個方法的執(zhí)行過程如下:

  • 調(diào)用 sync.WaitGroup.Add 增加待處理的任務(wù)
  • 創(chuàng)建新的 Goroutine 并運行子任務(wù)
  • 返回錯誤時及時調(diào)用 cancel 并對 err 賦值,只有最早返回的錯誤才會被上游感知到,后續(xù)錯誤都會被舍棄。
func (g *Group) Go(){
    g.wg.Add(1)
    go func() {
        defer g.wg.Done()
        if err := f(); err := nil {
            g.errOnce.Do(func () {
                g.err = err
                if g.cancel != nil {
                    g.cancel()
                }
            })
        }
    }()
}
func (g *Group) Wait() error {
    g.wg.Wait()
    if g.cancel != nil {
        g.cancel()
    }
    return g.err
}

另一個用于等待的 golang/sync/errgroup.Group.Wait 方法只是調(diào)用了 sync.WaitGroup.Wait,在子任務(wù)全部完成時取消 context.Context 并返回可能出現(xiàn)的錯誤。

小結(jié)

golang/sync/errgroup.Group 的實現(xiàn)沒有涉及底層和運行包中的API,它只是封裝了基本同步語義以提供更加復(fù)雜的功能。我們在使用它時需要注意兩個問題:

  • golang/sync/errgroup.Group 在出現(xiàn)錯誤或者等待結(jié)束后,會調(diào)用 context.Contextcancel 方法同步取消信號
  • 只有第一個出現(xiàn)的錯誤才會被返回,剩余錯誤會被直接丟棄

到此這篇關(guān)于Go語言擴展原語之ErrGroup的用法詳解的文章就介紹到這了,更多相關(guān)Go ErrGroup內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • go modules中replace使用方法

    go modules中replace使用方法

    這篇文章主要為大家介紹了go modules中replace使用方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • go sync Once實現(xiàn)原理示例解析

    go sync Once實現(xiàn)原理示例解析

    這篇文章主要為大家介紹了go sync Once實現(xiàn)原理示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • Go依賴注入DI工具wire使用詳解(golang常用庫包)

    Go依賴注入DI工具wire使用詳解(golang常用庫包)

    依賴注入是指程序運行過程中,如果需要調(diào)用另一個對象協(xié)助時,無須在代碼中創(chuàng)建被調(diào)用者,而是依賴于外部的注入,本文結(jié)合示例代碼給大家介紹Go依賴注入DI工具wire使用,感興趣的朋友一起看看吧
    2022-04-04
  • golang中字符串MD5生成方式總結(jié)

    golang中字符串MD5生成方式總結(jié)

    在本篇文章里小編給大家整理的是一篇關(guān)于golang中字符串MD5生成方式總結(jié)內(nèi)容,有興趣的朋友們可以跟著學(xué)習(xí)參考下。
    2021-07-07
  • Go語言基礎(chǔ)閉包的原理分析示例詳解

    Go語言基礎(chǔ)閉包的原理分析示例詳解

    這篇文章主要為大家介紹了Go語言基礎(chǔ)閉包的底層原理及實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2021-11-11
  • Golang設(shè)計模式之責任鏈模式講解和代碼示例

    Golang設(shè)計模式之責任鏈模式講解和代碼示例

    責任鏈是一種行為設(shè)計模式, 允許你將請求沿著處理者鏈進行發(fā)送, 直至其中一個處理者對其進行處理,本文就詳細給大家介紹一下Golang 責任鏈模式,文中有詳細的代碼示例,需要的朋友可以參考下
    2023-06-06
  • golang配置管理神器Viper使用教程

    golang配置管理神器Viper使用教程

    這篇文章主要為大家介紹了golang配置管理神器Viper使用教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2022-04-04
  • 詳解Go語言中select語句的常見用法

    詳解Go語言中select語句的常見用法

    這篇文章主要是來和大家介紹一下Go語言中select?語句的常見用法,以及在使用過程中的注意事項,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2023-07-07
  • Go語言實現(xiàn)本地緩存的策略詳解

    Go語言實現(xiàn)本地緩存的策略詳解

    今天給大家分享的是Go語言本地緩存的一些內(nèi)容,主要是結(jié)合bigcache和fastcache兩個優(yōu)秀的開源代碼庫,總結(jié)一些設(shè)計思路和感悟,文章通過代碼示例介紹的非常詳細,需要的朋友可以參考下
    2023-07-07
  • Go?gRPC進階教程gRPC轉(zhuǎn)換HTTP

    Go?gRPC進階教程gRPC轉(zhuǎn)換HTTP

    這篇文章主要為大家介紹了Go?gRPC進階教程gRPC轉(zhuǎn)換HTTP教程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06

最新評論

通江县| 淳化县| 平顶山市| 高州市| 扎赉特旗| 秦安县| 呼伦贝尔市| 林西县| 德惠市| 喀喇沁旗| 高邮市| 望江县| 城步| 介休市| 巴塘县| 将乐县| 新泰市| 伊宁市| 常宁市| 南通市| 新乡市| 奎屯市| 龙川县| 太谷县| 宁波市| 汉寿县| 南宁市| 富阳市| 玉溪市| 文昌市| 应城市| 古丈县| 延安市| 梧州市| 双城市| 新巴尔虎右旗| 通山县| 武安市| 镇赉县| 赫章县| 临清市|