精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

errgroup:釋放 Go 的并發能力

開發
errgroup? 在 sync.WaitGroup? 之上提供了錯誤傳播、上下文取消與并發控制功能,簡化了復雜并發場景下的錯誤處理與資源管理。

errgroup 是 Go 官方擴展庫 golang.org/x/sync 提供的并發控制工具。在 sync.WaitGroup 的基礎上,它新增了錯誤傳播、上下文取消及并發限制等能力,為編寫健壯的并發程序提供了更高層的抽象。

errgroup 的優勢

與 sync.WaitGroup 相比,errgroup.Group 具備以下特性:

  • 集中錯誤處理:首個非 nil 錯誤會被捕獲并由 Wait 返回,同時自動取消其他協程。
  • 上下文取消:通過 errgroup.WithContext 與 context.Context 集成,可在任一協程出錯時主動取消剩余任務,避免資源浪費。
  • 簡化代碼:開發者無需手動維護錯誤狀態或同步邏輯,樣板代碼顯著減少。
  • 并發數量限制:SetLimit 方法可限制同時運行的 goroutine 數量,防止系統過載。

回顧 sync.WaitGroup

在介紹 errgroup.Group 之前,讓我們先回顧一下 sync.WaitGroup 的用法。

package main

import (
    "fmt"
    "net/http"
    "sync"
)

func main() {
    urls := []string{
        "http://www.golang.org/",
        "http://www.google.com/",
        "http://www.somestupidname.com/",
    }

    var (
        wg  sync.WaitGroup
        err error
    )

    for _, url := range urls {
        wg.Add(1)
        go func(u string) {
            defer wg.Done()
            resp, e := http.Get(u)
            if e != nil {
                err = e
                return
            }
            defer resp.Body.Close()
            fmt.Printf("fetch url %s status %s\n", u, resp.Status)
        }(url)
    }

    wg.Wait()
    if err != nil {
        fmt.Printf("error: %v\n", err)
    }
}

執行結果:

$ go run examples/main.go
fetch url http://www.google.com/ status 200 OK
fetch url http://www.golang.org/ status 200 OK
Error: Get "http://www.somestupidname.com/": dial tcp: lookup www.somestupidname.com: no such host

sync.WaitGroup 的典型用法如下:

var wg sync.WaitGroup

for ... {
    wg.Add(1)
    go func() {
        defer wg.Done()
        // do something
    }()
}

wg.Wait()

errgroup 基本用法

errgroup.Group 的使用模式類似于sync.WaitGroup:

package main

import (
    "fmt"
    "net/http"
    "golang.org/x/sync/errgroup"
)

func main() {
    urls := []string{
        "http://www.golang.org/",
        "http://www.google.com/",
        "http://www.somestupidname.com/",
    }

    var g errgroup.Group

    for _, url := range urls {
        u := url
        g.Go(func() error {
            resp, err := http.Get(u)
            if err != nil {
                return err
            }
            defer resp.Body.Close()
            fmt.Printf("fetch url %s status %s\n", u, resp.Status)
            return nil
        })
    }

    if err := g.Wait(); err != nil {
        fmt.Printf("error: %v\n", err)
    }
}

執行結果:

$ go run examples/main.go
fetch url http://www.google.com/ status 200 OK
fetch url http://www.golang.org/ status 200 OK
Error: Get "http://www.somestupidname.com/": dial tcp: lookup www.somestupidname.com: no such host

上下文取消

errgroup 提供 errgroup.WithContext 來添加取消功能:

package main

import (
    "context"
    "fmt"
    "net/http"
    "sync"
    "golang.org/x/sync/errgroup"
)

func main() {
    urls := []string{
        "http://www.golang.org/",
        "http://www.google.com/",
        "http://www.somestupidname.com/",
    }

    g, ctx := errgroup.WithContext(context.Background())
    var result sync.Map

    for _, url := range urls {
        u := url
        g.Go(func() error {
            req, err := http.NewRequestWithContext(ctx, http.MethodGet, u, nil)
            if err != nil {
                return err
            }
            resp, err := http.DefaultClient.Do(req)
            if err != nil {
                return err
            }
            defer resp.Body.Close()
            result.Store(u, resp.Status)
            return nil
        })
    }

    if err := g.Wait(); err != nil {
        fmt.Printf("error: %v\n", err)
    }

    result.Range(func(k, v any) bool {
        fmt.Printf("fetch url %s status %s\n", k, v)
        return true
    })
}

執行結果:

$ go run examples/withcontext/main.go
Error:  Get "http://www.somestupidname.com/": dial tcp: lookup www.somestupidname.com: no such host
fetch url http://www.google.com/ status 200 OK

如示例所示,somestupidname.com 請求失敗后,其余協程自動取消,節省了不必要的網絡開銷。

限制并發數量

errgroup 提供 errgroup.SetLimit 來限制并發執行的 goroutines 數量:

package main

import (
    "fmt"
    "time"
    "golang.org/x/sync/errgroup"
)

func main() {
    var g errgroup.Group
    g.SetLimit(3) // 同時僅允許 3 個 goroutine

    for i := 1; i <= 10; i++ {
        id := i
        g.Go(func() error {
            fmt.Printf("goroutine %d start\n", id)
            time.Sleep(2 * time.Second)
            fmt.Printf("goroutine %d done\n", id)
            return nil
        })
    }

    if err := g.Wait(); err != nil {
        fmt.Printf("error: %v\n", err)
    }
    fmt.Println("all goroutines complete")
}

執行結果:

$  go run examples/main.go
Goroutine 3 is starting
Goroutine 1 is starting
Goroutine 2 is starting
Goroutine 2 is done
Goroutine 1 is done
Goroutine 5 is starting
Goroutine 3 is done
Goroutine 6 is starting
Goroutine 4 is starting
Goroutine 6 is done
Goroutine 5 is done
Goroutine 8 is starting
Goroutine 4 is done
Goroutine 7 is starting
Goroutine 9 is starting
Goroutine 9 is done
Goroutine 8 is done
Goroutine 10 is starting
Goroutine 7 is done
Goroutine 10 is done
All goroutines complete.

TryGo:嘗試啟動任務

errgroup 提供errgroup.TryGo 來嘗試啟動一個任務,這需要與 errgroup.SetLimit 一起使用。

TryGo 在達到并發上限時立即返回 false,避免阻塞:

package main

import (
    "fmt"
    "time"
    "golang.org/x/sync/errgroup"
)

func main() {
    var g errgroup.Group
    g.SetLimit(3)

    for i := 1; i <= 10; i++ {
        id := i
        if g.TryGo(func() error {
            fmt.Printf("goroutine %d start\n", id)
            time.Sleep(2 * time.Second)
            fmt.Printf("goroutine %d done\n", id)
            return nil
        }) {
            fmt.Printf("goroutine %d accepted\n", id)
        } else {
            fmt.Printf("goroutine %d rejected (limit reached)\n", id)
        }
    }

    _ = g.Wait()
}

執行結果:

$ go run examples/main.go
Goroutine 1 started successfully
Goroutine 1 is starting
Goroutine 2 is starting
Goroutine 2 started successfully
Goroutine 3 started successfully
Goroutine 4 could not start (limit reached)
Goroutine 5 could not start (limit reached)
Goroutine 6 could not start (limit reached)
Goroutine 7 could not start (limit reached)
Goroutine 8 could not start (limit reached)
Goroutine 9 could not start (limit reached)
Goroutine 10 could not start (limit reached)
Goroutine 3 is starting
Goroutine 2 is done
Goroutine 3 is done
Goroutine 1 is done
All goroutines complete.

結論

errgroup 在 sync.WaitGroup 之上提供了錯誤傳播、上下文取消與并發控制功能,簡化了復雜并發場景下的錯誤處理與資源管理。通過合理使用 WithContext、SetLimit 及 TryGo,開發者能更高效地編寫可維護、穩健的并發代碼。

責任編輯:趙寧寧 來源: 令飛編程
相關推薦

2025-09-05 01:55:00

Go并發錯誤項目

2021-08-05 07:58:22

并發編程包Task

2022-10-24 00:48:58

Go語言errgroup

2024-11-27 10:23:31

2023-10-07 09:59:16

gRPC通信

2025-05-22 09:01:28

2023-12-21 07:09:32

Go語言任務

2023-12-29 08:10:41

Go并發開發

2021-07-30 07:28:15

WorkerPoolGo語言

2025-06-17 09:32:15

2021-07-15 23:18:48

Go語言并發

2013-05-28 09:43:38

GoGo語言并發模式

2022-10-17 08:07:13

Go 語言并發編程

2024-06-17 08:40:16

2021-08-30 07:49:31

Linux內核負載均衡

2020-01-14 11:17:33

Go并發Linux

2023-05-15 08:01:16

Go語言

2010-02-23 16:46:47

WCF并發能力

2016-01-20 12:07:49

阿里云云棲大會大數據

2016-10-28 17:39:47

phpgolangcoroutine
點贊
收藏

51CTO技術棧公眾號

中文字幕1区2区| 日本免费成人网| 国产区精品在线| aa级大片欧美三级| 一区二区亚洲精品国产| 午夜啪啪小视频| 91福利区在线观看| 国产精品麻豆久久久| 丁香五月网久久综合| 久久精品五月天| 综合五月婷婷| 亚洲色图17p| 熟女人妻一区二区三区免费看| 黄色亚洲网站| 夜夜精品浪潮av一区二区三区| 欧美日韩在线精品| 亚洲老妇色熟女老太| 日本最新不卡在线| 97视频在线观看免费| 911国产在线| 蜜乳av综合| 91精品国产乱| 天天爽夜夜爽一区二区三区| 99久久精品免费看国产小宝寻花| 国产精品美女视频| 久久九九视频| 黑人精品一区二区| 国产在线不卡一卡二卡三卡四卡| 国产精品扒开腿做爽爽爽的视频| 日韩经典在线观看| 国产精品多人| 美日韩精品视频免费看| 免费黄色在线网址| 日韩深夜福利| 亚洲国产成人一区| gogo亚洲国模私拍人体| 午夜不卡一区| 欧美日韩国产综合一区二区三区 | 欧美日韩国产高清一区| 日韩av片在线看| 182在线播放| 亚洲风情在线资源站| 日韩精品一区二区三区电影| 亚洲s色大片| 国产目拍亚洲精品99久久精品| 蜜桃传媒视频第一区入口在线看| 色欲av永久无码精品无码蜜桃| 国产盗摄女厕一区二区三区 | 亚洲综合欧美激情| 国产经典一区| 欧美影院一区二区三区| 青青青国产在线视频| 欧美xxx网站| 第一福利永久视频精品| 中文字幕无码精品亚洲35| 国产黄色大片在线观看| 一片黄亚洲嫩模| 全黄性性激高免费视频| free性护士videos欧美| 午夜久久久久久电影| 男人日女人bb视频| 婷婷综合六月| 欧美偷拍一区二区| 亚洲精品综合在线观看| 久久av偷拍| 精品国产乱码久久久久久闺蜜| 俄罗斯黄色录像| 青青操综合网| 国产亚洲免费的视频看| 国产一二三四区在线| 欧美电影《轻佻寡妇》| 欧美另类老女人| 国产 欧美 日韩 在线| 美女91精品| 国产精品视频白浆免费视频| 国产欧美熟妇另类久久久| 国产福利不卡视频| 精品久久久久久亚洲| 美女做暖暖视频免费在线观看全部网址91 | 黄色录像a级片| 国产亚洲一区二区三区不卡| 最新日韩中文字幕| 美女的奶胸大爽爽大片| 亚洲每日更新| 国产精品高潮粉嫩av| 一区不卡在线观看| 成人禁用看黄a在线| 欧美不卡三区| www国产在线观看| 精品久久久久久久久久久久| 污视频网址在线观看| 91精品国产自产精品男人的天堂| 精品视频偷偷看在线观看| 中文字幕精品亚洲| 最新日韩欧美| 国产日韩欧美在线| 性xxxx视频播放免费| 国产精品视频九色porn| 欧美成人精品免费| 黄色精品视频| 亚洲精品99久久久久| 激情无码人妻又粗又大| 在线综合视频| 97久久人人超碰caoprom欧美| 神马亚洲视频| 亚洲综合av网| 色91精品久久久久久久久| 麻豆精品少妇| 久久综合电影一区| 国产一区二区视频免费| 国产精品1024| 亚洲午夜精品久久久中文影院av| 成人三级高清视频在线看| 欧美肥妇毛茸茸| 久操视频免费看| 欧美日韩一卡| 91中文在线视频| 免费福利在线视频| 精品欧美国产一区二区三区| 杨幂一区二区国产精品| 日韩久久电影| 国产精品久久久久久久9999| 午夜激情在线视频| 亚洲一区在线观看视频| 亚洲av毛片在线观看| 青青草原综合久久大伊人精品 | 中国老女人av| 青娱乐极品盛宴一区二区| 亚洲欧美国产日韩天堂区| 国产在线拍揄自揄拍| 国产精品一二三区在线| 中文字幕中文字幕在线中心一区| 国产精品亚洲d| 亚洲男人天天操| 国产成人一级片| 99久久综合国产精品| 大陆av在线播放| 日本超碰一区二区| 久久国产精品久久国产精品| 91亚洲视频在线观看| 国产精品传媒入口麻豆| 亚洲欧美国产中文| 91九色精品国产一区二区| 国产精品永久免费| jzzjzzjzz亚洲成熟少妇| 色噜噜狠狠色综合欧洲selulu| 国产精品久久AV无码| 99国产精品久久久久久久成人热| 国产精品一 二 三| √8天堂资源地址中文在线| 欧美精品一区二区三区在线| 国产无遮挡aaa片爽爽| 菠萝蜜视频在线观看一区| 国产精品久久久久9999爆乳| 97久久综合精品久久久综合| 欧美精品videofree1080p| 亚洲精品久久久狠狠狠爱| 亚洲国产精品自拍| 欧美一区二区三区成人精品| 日韩二区三区四区| 亚洲午夜精品久久| 亚洲精品观看| 5566日本婷婷色中文字幕97| 免费在线一级视频| 欧美日韩一区二区欧美激情| 亚洲精品电影院| 国产成人在线网站| 日韩精品―中文字幕| 深爱激情综合网| 国产欧美精品一区二区三区介绍| 黄色免费网站在线观看| 日韩美女视频在线| wwwxxx亚洲| 国产亚洲女人久久久久毛片| 亚洲一级免费在线观看| 中文字幕一区二区三区久久网站| 国产私拍一区| 国产一区一一区高清不卡| 欧美日韩成人网| 日中文字幕在线| 欧美日韩精品系列| 日韩欧美亚洲视频| 中文字幕欧美日韩一区| 成人做爰69片免费| 久久精品人人做人人爽电影蜜月| 一区二区精品在线| 欧美日韩导航| 国产日韩欧美黄色| 美女搞黄视频在线观看| 综合欧美国产视频二区| 亚洲第一视频在线| 日本韩国精品在线| 国产私拍一区| 中文字幕第69页| 奇米在线7777在线精品 | 伊人网在线视频观看| 韩国v欧美v日本v亚洲v| 久久免费视频3| 综合久久十次| 亚洲成色最大综合在线| 第四色在线一区二区| 91精品国产自产在线老师啪 | 亚洲夜间福利| 一区二区三区免费看| 亚瑟一区二区三区四区| 亚洲永久免费观看| 户外露出一区二区三区| 欧美福利视频网站| jyzzz在线观看视频| 亚洲精品videossex少妇| aaa国产视频| 欧美无人高清视频在线观看| 亚洲国产成人精品激情在线| 亚洲黄色av一区| 国产三级aaa| 久久久午夜精品| aaaa黄色片| 国产91丝袜在线播放九色| 天天色综合社区| 丝袜亚洲精品中文字幕一区| 久久久亚洲精品无码| 欧美xxx在线观看| 一区二区精品视频| 俺要去色综合狠狠| 欧美日韩大片一区二区三区| 久草精品视频| 国产精品二区在线观看| 精品国产一区二区三区性色av| 国产精品福利小视频| 中文字幕人成乱码在线观看| 欧美激情按摩在线| 91国内在线| 久久精品国产欧美亚洲人人爽| av在线播放网站| 正在播放国产一区| 国内精品在线视频| 亚洲男人天堂手机在线| 日本在线一二三| 亚洲精品一区二区在线| 手机看片一区二区三区| 亚洲国产另类久久精品| 欧美特黄一级视频| 亚洲国产精品热久久| 蜜臀av中文字幕| 亚洲国产精品高清久久久| 欧洲精品久久一区二区| 亚洲国产精品专区久久| 性感美女视频一二三| 日韩精品丝袜在线| 日本高清中文字幕二区在线| 国产丝袜高跟一区| 国产私拍精品| 精品在线网站观看| 国产999精品| 婷婷六月国产精品久久不卡| 国产成人精品日本亚洲专区61| 性欧美videohd高精| 国产精品视频中文字幕91| 国产一区二区三区四区五区3d| 国产美女扒开尿口久久久| 色999韩欧美国产综合俺来也| 91精品在线观看视频| 日韩欧美中文字幕一区二区三区| 国产精品免费一区二区三区观看| 另类ts人妖一区二区三区| 欧美不卡福利| 国产精品久久久久久| 成年人视频网站免费| 99国产精品| 97公开免费视频| 极品美女销魂一区二区三区| 亚洲av无码久久精品色欲| av动漫一区二区| 一级黄色片网址| 一区二区不卡在线视频 午夜欧美不卡在| 国产精品自拍视频一区| 在线亚洲免费视频| 国产美女免费视频| 亚洲国产精品悠悠久久琪琪| av影片免费在线观看| 欧美日韩第一页| 成人av观看| 亚洲a∨日韩av高清在线观看| 久久婷婷国产| 亚洲春色在线视频| 亚洲高清自拍| 黑人粗进入欧美aaaaa| 国产不卡视频在线观看| 全黄一级裸体片| 亚洲精选视频在线| 久久久久久无码午夜精品直播| 91精品国产综合久久香蕉麻豆 | 国产一区二区三区欧美| 成人在线直播| 欧美精品播放| 亚洲小说欧美另类激情| 一区二区国产精品| 欧美激情国内自拍| 久久综合狠狠综合久久激情| 高h视频免费观看| 在线观看欧美日本| 亚洲精品久久久久久久久久| 国产亚洲精品久久久久久牛牛 | 三级黄视频在线观看| 久久综合国产精品台湾中文娱乐网| 亚洲小少妇裸体bbw| 91视频99| 日韩理论电影大全| 亚洲午夜精品久久久久久人妖| 韩国成人福利片在线播放| 国产三级av在线播放| 亚洲大片免费看| 国产人妖一区二区| 中文字幕日韩有码| 亚洲欧美se| 国产欧美日韩综合一区在线观看| 亚洲成av人片一区二区密柚| 成人免费毛片播放| 久久青草欧美一区二区三区| 国产真人真事毛片| 亚洲男人天堂一区| 毛片在线免费视频| 精品国产一区二区三区av性色| 黄色免费网站在线| 国产精品免费网站| 国产一区二区三区91| www.浪潮av.com| 成人美女在线视频| 国产一二三四在线| 欧美va亚洲va香蕉在线 | 欧美最猛黑人xxxx黑人猛叫黄| 综合激情网...| 国产精品自拍合集| 国产精品主播直播| 懂色av懂色av粉嫩av| 69堂成人精品免费视频| 日本高清视频在线播放| 国产精品自拍网| 手机亚洲手机国产手机日韩| 激情婷婷综合网| 国产欧美一区二区三区鸳鸯浴 | 日韩av一级大片| 久久久久久久高潮| a天堂中文字幕| 在线一区二区视频| 国产三级在线观看| 国产精品久久久久久久久久久久久久 | 日本黄区免费视频观看 | 精品欧美一区二区精品少妇| 久久九九免费视频| 精品一区二区三区在线观看视频| 中国一级黄色录像| 粉嫩高潮美女一区二区三区| 日韩av片在线播放| 亚洲欧美日韩在线高清直播| 欧美成人免费电影| 性欧美.com| 国产一区二区三区日韩| 欧美交换国产一区内射| 亚洲第一区在线观看| 性国裸体高清亚洲| 亚洲成人一区二区三区| 韩国视频一区二区| 国产一级做a爱免费视频| 日韩精品视频三区| 日韩天堂在线| 色哺乳xxxxhd奶水米仓惠香| 丁香一区二区三区| 婷婷激情五月网| 丝袜美腿精品国产二区| 7777精品| 黑鬼大战白妞高潮喷白浆| 日本一区二区免费在线| 国产999久久久| 国产91|九色| 国产国产精品| 亚洲综合自拍网| 欧美精品久久久久久久多人混战| 黄色小说在线播放| 欧美下载看逼逼| 国内久久婷婷综合| 日操夜操天天操| 自拍偷拍亚洲区| 极品束缚调教一区二区网站 | 色黄久久久久久| 91欧美日韩在线| 免费涩涩18网站入口| 夜夜操天天操亚洲| 久草福利在线| 成人18视频| 日韩国产欧美三级| 久久老司机精品视频| 亚洲香蕉在线观看| 7m精品国产导航在线| 超碰在线公开97| 福利一区福利二区微拍刺激| 国产原创精品视频| 欧美欧美一区二区| 国产.欧美.日韩| 国产精品久久久久久久久毛片 |