Golang&Python

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

2017-12-02  本文已影响310人  lesliefang

通常我们在 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")
}
上一篇下一篇

猜你喜欢

热点阅读