Golang 怎么在并发编程中等待多个 goroutine 结束?

本文阅读 1 分钟
首页 golang 正文
题目序号:(2370)
题目来源: 小米
频次: 1

答案:小强

  1. 使用channel
func main() {
    ch := make(chan struct{}, 10)

    for i := 0; i < 10; i++ {
        go func() {
            fmt.Println("do work...")
            ch <- struct{}{}
        }()
    }

    for i := 0; i < 10; i++ {
        <-ch
    }
    close(ch)

    fmt.Println("work finish")
}

2.使用sync.waitgroup ,errgroup的功能更加强大能够捕获协程中的错误。

func main(){
    var wg sync.WaitGroup
    wg.Add(10)

    for i := 0; i < 10; i++ {
        go func() {
            fmt.Println("do work...")
            wg.Done()
        }()
    }

    wg.Wait()
    fmt.Println("work finish")
}

3.使用errgroup.Group 相比waitgroup它的功能更加强大能够捕获协程中的错误

func main(){
    group := new(errgroup.Group)

    for i := 0; i < 5; i++ {
        i := i
        group.Go(func() error {
            if i >= 3 {
                return fmt.Errorf("num can not great 2 %v", i)
            }
            fmt.Println(i)
            return nil
        })
    }

    if err := group.Wait(); err != nil {
        fmt.Println(err)
    }
    
    fmt.Println("work finish")
}
本文来自投稿,不代表本站立场,如若转载,请注明出处:
syncpool的实现原理
« 上一篇 09-17
问了sync.Map(我说我对sync.Pool比较熟,就说Pool了)
下一篇 » 09-17

发表评论

发表评论