[go]等待 goroutine 结束

默认情况下,程序不会等待 goroutine 结束就退出了。 下面将讲解一种等待所有 goroutine 结束的方法:使用 sync.WaitGroup

使用 sync.WaitGroup

package main

import (
    "fmt"
    "sync"
)

func main() {
    var wg sync.WaitGroup // 定义 WaitGroup
    arr := [3]string{"a", "b", "c"}

    for _, v := range arr {
        wg.Add(1) // 增加一个 wait 任务
        go func(s string) {
            defer wg.Done() // 函数结束时,通知此 wait 任务已经完成
            fmt.Println(s)
        }(v)
    }

    // 等待所有任务完成
    wg.Wait()

}

在线演示地址:http://play.golang.org/p/fECMMK8Rja

使用 chan

评论区 remones 大佬提到了另一种方法,那就是使用 chan 来实现。

package main

import "fmt"

func main() {
    arr := [3]string{"a", "b", "c"}
    ch := make(chan struct{}, len(arr))

    for _, v := range arr {
        go func(s string) {
            fmt.Println(s)
            ch <- struct{}{}
        }(v)
    }

    for i := 0; i < len(arr); i++ {
        <-ch
    }

}

或者 remones 大佬的版本:

package main

import (
    "fmt"
    "time"
)

func main() {
    workFn := func(n int) <-chan struct{} {
        doneC := make(chan struct{})
        go func(n int) {
            time.Sleep(100 * time.Millisecond)
            fmt.Printf("routine %d was finished.\n", n)
            doneC <- struct{}{}
        }(n)
        return doneC
    }

    chs := make([]<-chan struct{}, 0, 5)
    for i := 0; i < 5; i++ {
        ch := workFn(i)
        chs = append(chs, ch)
    }
    for _, ch := range chs {
        <-ch
    }
}

Comments