精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

日韩美女天天操| 911久久香蕉国产线看观看| 天天综合色天天综合色h| 精品综合久久久| 亚洲成熟少妇视频在线观看| av亚洲在线观看| 欧美一区中文字幕| 男人添女人下部视频免费| 日本wwwxxxx| 日韩av在线发布| 久久91精品国产91久久跳| 成年人网站免费在线观看| 日韩av电影资源网| 亚洲主播在线播放| 先锋影音网一区| 俄罗斯嫩小性bbwbbw| 日韩成人午夜精品| 欧美精品www| 精品国产乱码91久久久久久网站| 久久影院在线观看| 久久久久久久久久久久国产精品| 欧美成人ⅴideosxxxxx| |精品福利一区二区三区| 国产一区免费| 国产女同91疯狂高潮互磨| 国产精品社区| 欧美成人性色生活仑片| 级毛片内射视频| 这里视频有精品| 欧美日韩国产在线播放网站| 野外做受又硬又粗又大视频√| 中文日本在线观看| 97久久精品人人做人人爽| 91网站在线免费观看| 中文字幕手机在线视频| 一本色道久久综合亚洲精品不| 久久久精品在线观看| 国产伦精品一区二区三区免| 欧美xxxxxbbbbb| 在线免费av资源| 亚洲一区自拍偷拍| 一区二区在线观看网站| 手机亚洲第一页| 成人一区二区三区视频| 国产精品不卡一区二区三区| 极品校花啪啪激情久久| 99热这里只有精品在线| 日日夜夜精品免费视频| 欧美专区日韩视频| 日韩免费不卡视频| 欧美激情第10页| 另类图片亚洲另类| 日韩激情综合网| 欧美成人milf| 中文字幕九色91在线| 内射毛片内射国产夫妻| 精品久久久久久久| 夜夜嗨av色一区二区不卡| 欧美熟妇激情一区二区三区| 精品日韩欧美一区| 丝袜亚洲欧美日韩综合| 美国精品一区二区| 999国产精品永久免费视频app| 日韩在线免费高清视频| 黄色录像一级片| 911久久香蕉国产线看观看| 欧美裸体xxxx极品少妇| 国产亚洲欧美精品久久久www| 亚洲午夜精品久久久久久app| 久久久视频在线| 国产a∨精品一区二区三区仙踪林| 亚洲永久视频| 国产精品中文字幕在线观看| 在线免费观看一区二区| 国内欧美视频一区二区| 97超碰人人模人人爽人人看| 亚洲伦理在线观看| 99国产精品一区| 青青草成人激情在线| www.在线视频.com| 亚洲欧美日韩国产成人精品影院 | 久久亚洲私人国产精品va媚药| 欧美精品一区二区三区在线四季| 国产精品毛片一区二区三区四区| 国产精品免费av| 真人做人试看60分钟免费| 久久不射影院| 色婷婷综合久色| 亚洲精品性视频| 欧美专区一区| 精品中文视频在线| 午夜国产福利视频| 亚洲日本免费| 国产精品稀缺呦系列在线| 99热这里只有精品1| 91看片淫黄大片一级| 一区二区三区|亚洲午夜| 国产丝袜在线观看视频| 91成人网在线| 国产精品嫩草69影院| 精品在线91| 欧美精品免费在线| 日本高清不卡码| 国产在线观看一区二区| 欧美成人蜜桃| 在线播放免费av| 91福利小视频| 免费不卡的av| 久久免费av| 日本精品久久久久影院| 国产suv精品一区二区69| 91麻豆国产福利在线观看| 精品久久免费观看| 午夜精品成人av| 精品国产乱码久久久久久1区2区 | 欧美亚洲色图校园春色| 久久精品色欧美aⅴ一区二区| 久久久久99精品成人片三人毛片| 国产精品一区二区91| 日韩亚洲不卡在线| 91色在线看| 欧美一区二区三区在线| 99精品全国免费观看| 国产精品丝袜xxxxxxx| 97人人模人人爽人人少妇| 国产三级视频在线看| 亚洲h精品动漫在线观看| 一级黄色在线播放| 青青草国产成人a∨下载安卓| 91精品国产沙发| 亚洲第一天堂在线观看| 自拍偷在线精品自拍偷无码专区| 亚洲国产精品毛片av不卡在线| 成人线上播放| 欧美噜噜久久久xxx| 国产精品视频a| 国产精品情趣视频| 中文字幕在线导航| 自拍偷拍欧美一区| 欧美一级大片视频| 午夜激情小视频| 五月天久久比比资源色| 日本50路肥熟bbw| 综合一区在线| 亚洲自拍偷拍网址| 激情视频在线观看| 91精品免费观看| 林心如三级全黄裸体| 日韩成人免费在线| 亚洲春色综合另类校园电影| 日韩欧美少妇| 在线播放国产精品| 中文字幕在线观看1| 国产精品看片你懂得| 91小视频在线播放| 亚洲女同另类| 国产91社区| 国内小视频在线看| 亚洲国产成人精品女人久久久| 国产亚洲精久久久久久无码77777| 成人在线一区二区三区| 久久国产精品网| 奇米影视777在线欧美电影观看| 69久久夜色精品国产69| 男人久久精品| 欧美日韩在线直播| 色哟哟一一国产精品| 国产成人午夜精品影院观看视频| 国产精品视频网站在线观看| 欧美自拍视频| 国产精品吹潮在线观看| 黄色网址视频在线观看| 精品剧情在线观看| 国产精品视频一区在线观看| 亚洲国产精品二十页| 亚洲天堂伊人网| 亚洲午夜精品久久久久久app| 麻豆成人小视频| 成人自拍视频网| 欧美成人在线影院| 日韩黄色影片| 777久久久精品| 国产主播在线播放| 久久嫩草精品久久久精品| 无码日韩人妻精品久久蜜桃| 婷婷激情图片久久| 国内一区二区三区在线视频| 全球最大av网站久久| 欧美日韩福利视频| 男人av在线| 91精品国产综合久久福利软件| 日韩av在线播放观看| 国产片一区二区三区| 麻豆传媒在线看| 久久九九99| 51xx午夜影福利| 九热爱视频精品视频| 亚洲字幕一区二区| 成人做爰视频www网站小优视频| 久久午夜a级毛片| 日本aaa在线观看| 日韩三级视频在线观看| 日韩三级一区二区| 亚洲激情六月丁香| 国产精久久一区二区三区| 国产成人免费在线观看| 美女喷白浆视频| 在线免费观看欧美| ijzzijzzij亚洲大全| 久久99精品久久久久久园产越南| 91久久极品少妇xxxxⅹ软件| 成人网ww555视频免费看| 韩国欧美亚洲国产| 菠萝菠萝蜜在线观看| 伊人精品在线观看| 亚洲欧美日韩成人在线| 欧美成人精品3d动漫h| 在线观看毛片av| 色诱视频网站一区| 日本熟女一区二区| 亚洲狠狠丁香婷婷综合久久久| 国产91丝袜美女在线播放| 91在线播放网址| 99热这里只有精品2| 久久精品久久99精品久久| 116极品美女午夜一级| 激情欧美亚洲| 国产日韩欧美大片| 亚洲成人二区| 正在播放久久| 欧美h版在线| 日本一区二区在线| 日韩大尺度在线观看| 国产精品久久久久久久久婷婷| 日本高清精品| 91性高湖久久久久久久久_久久99| 国产亚洲精品精品国产亚洲综合| 国产97免费视| 校园春色亚洲色图| 欧美在线性视频| h片在线观看下载| 欧美日韩国产成人| 最新国产露脸在线观看| 久久伊人色综合| 二区三区在线观看| 久久成人av网站| 亚洲奶水xxxx哺乳期| 欧美乱大交xxxxx另类电影| 在线观看的网站你懂的| 欧美极品欧美精品欧美视频| 国产探花视频在线观看| 97热在线精品视频在线观看| 美女91在线看| 欧美一级视频免费在线观看| 日韩性xxx| 国产精品久久久久久久久久新婚| 一区二区视频免费完整版观看| 国产精品久久久久av免费| 51一区二区三区| 成人福利在线观看| 日韩区欧美区| 好看的日韩精品视频在线| 夜色77av精品影院| 亚洲午夜在线观看| 亚洲欧洲中文字幕| 黄网站欧美内射| 久久经典综合| 一区二区三区网址| 国产真实乱偷精品视频免| 中文字幕乱妇无码av在线| 99视频精品在线| 精品无码国产污污污免费网站| 欧美激情一区二区三区在线| 亚洲不卡在线播放| 亚洲一区二区三区中文字幕| 97久久久久久久| 欧美天堂亚洲电影院在线播放| 国产精品久久久久久在线| 精品免费99久久| 飘雪影视在线观看免费观看 | 欧美日韩在线看片| 欧美猛交免费看| 成人免费网站视频| 91精品国产综合久久香蕉| 久久a级毛片毛片免费观看| 欧美日韩无遮挡| 中文字幕免费一区二区| 日本www在线播放| 极品少妇xxxx精品少妇| a级一a一级在线观看| 欧美极品少妇xxxxⅹ高跟鞋| 久久久久久久久久久97| 色吊一区二区三区| 亚洲精品国产片| 这里只有精品视频| 国产精品186在线观看在线播放| 国产精品成人久久久久| 亚洲一区网址| 日韩hmxxxx| 在线播放不卡| 欧美特黄aaa| 久久综合九色综合97婷婷| 国产天堂av在线| 欧美午夜影院在线视频| 国产免费一区二区三区免费视频| 欧美mv日韩mv国产网站app| 成人综合影院| 午夜精品理论片| 精品国产一级| 色播五月综合| 欧美专区18| 最新日本中文字幕| 国产精品久久久久久久久免费相片 | 久久久久久久久久久av| 欧美激情啪啪| 免费观看成人高| 精品96久久久久久中文字幕无| av免费一区二区| 日本一区二区三区四区在线视频| 国产一级理论片| 欧美一区日韩一区| 三区四区电影在线观看| 奇米一区二区三区四区久久| 国产精品色呦| 丁香色欲久久久久久综合网| 美女视频黄 久久| 国产又粗又猛又爽又黄av| 天天免费综合色| 亚洲黄色小说网址| 欧美精品一区在线播放| 色综合视频一区二区三区日韩| 日本视频一区二区不卡| 亚洲一区视频| 一边摸一边做爽的视频17国产 | 日韩中文在线字幕| 美女视频免费一区| 五月天精品在线| 欧美日韩情趣电影| 色综合久久久久综合一本到桃花网| 国产精品久久9| 国产精品一区高清| 亚洲欧洲日产国码无码久久99| 99在线精品一区二区三区| 亚洲精品午夜久久久久久久| 精品国产91洋老外米糕| bl在线肉h视频大尺度| 国产视频一区二区不卡| 在线日韩欧美| 亚洲天堂资源在线| 欧美日韩性视频在线| 亚州男人的天堂| 97免费中文视频在线观看| 丝袜连裤袜欧美激情日韩| 人妻有码中文字幕| 久久久不卡网国产精品二区| 青青视频在线免费观看| 一个色综合导航| 激情久久一区二区| 黄瓜视频免费观看在线观看www| 韩国女主播成人在线| 免费在线观看黄色av| 亚洲国产高清高潮精品美女| 在线播放高清视频www| 欧美一区二区三区电影在线观看| 视频一区二区三区在线| 三级黄色录像视频| 日韩欧美一级片| 免费成人在线电影| 欧美系列一区| 精彩视频一区二区| 国产一级在线观看视频| 亚洲乱亚洲乱妇无码| 成人激情视屏| 成人在线免费高清视频| av高清不卡在线| 国产99久久久久久免费看| www.美女亚洲精品| caoporn成人免费视频在线| 成年人视频观看| 国产精品欧美一区喷水| 精品国产av一区二区| 91精品国产乱码久久久久久蜜臀 | 亚洲区一区二区| 亚洲人体在线| 9久久9毛片又大又硬又粗| 中文字幕av不卡| 亚洲黄色一级大片| 国产精品欧美日韩| 国户精品久久久久久久久久久不卡| 国产偷人妻精品一区| 欧美乱熟臀69xxxxxx| аⅴ资源天堂资源库在线| 亚洲一卡二卡三卡| 成人精品国产免费网站| 国产精品无码粉嫩小泬| 欧美激情影音先锋| 日韩精品不卡一区二区| 国产白袜脚足j棉袜在线观看| 欧美性大战久久| av在线播放资源|