美文网首页Golang&Python
go 等待所有 goroutine 执行结束的方法

go 等待所有 goroutine 执行结束的方法

作者: lesliefang | 来源:发表于2017-12-02 19:16 被阅读310次

    通常我们在 main 中需要等待所有的 goroutine 都执行完毕时再退出
    一般有两种方法
    方法一大家都能想到用 channel 进行同步

    func main() {
        ch := make(chan int, 2)
    
        go func() {
            for i := 0; i < 10; i++ {
                time.Sleep(1 * time.Second)
                fmt.Println("go routine1", i)
            }
            ch <- 1
        }()
        go func() {
            for i := 0; i < 10; i++ {
                time.Sleep(1 * time.Second)
                fmt.Println("go routine2", i)
            }
            ch <- 2
        }()
    
        // 等待
        for i := 0; i < 2; i++ {
            <-ch
        }
    
        fmt.Println("main exist")
    }
    

    这种方法需要知道子 goroutine 的个数

    方法二用 sync.WaitGroup,这也是官方推荐方法,不需要知道 gotoutine 的个数

    package main
    
    import "fmt"
    import "time"
    import "sync"
    
    func main() {
        var wg sync.WaitGroup
    
        for i := 0; i < 10; i++ {
            wg.Add(1)
            go func(i int) {
                defer wg.Done()
                time.Sleep(1 * time.Second)
                fmt.Println(i)
            }(i)
        }
    
        wg.Wait() // 等待
    
        fmt.Println("main exist")
    }
    

    相关文章

      网友评论

        本文标题:go 等待所有 goroutine 执行结束的方法

        本文链接:https://www.haomeiwen.com/subject/uotobxtx.html