调用函数返回的Goroutine终止

时间:2018-10-13 20:03:14

标签: go

如果我在函数中生成一个goroutine,并且该函数返回,该goroutine会终止,还是会继续执行?

1 个答案:

答案 0 :(得分:0)

您必须等待程序主线程(或在main方法中说完)中的所有goroutine完成。

举个例子

package main

import (
    "fmt"
    "time"
)

func foo() {
    go func() {
        fmt.Println("sleeping for 5 sec")
        time.Sleep(5 * time.Second)
        fmt.Println("Done")
    }()
}

func main() {
    foo()
}

当您运行上述代码时,它将立即退出(意味着主线程将不等待goroutine首先完成)。

要在 go 中实现此目标,我正在使用https://golang.org/pkg/sync/#WaitGroup

package main

import (
    "fmt"
    "sync"
    "time"
)

// see https://golang.org/pkg/sync/#WaitGroup
var wg sync.WaitGroup

func foo() {
    go func() {
        wg.Add(1)
        defer wg.Done()

        fmt.Println("sleeping for 5 sec")
        time.Sleep(5 * time.Second)
        fmt.Println("Done")
    }()
}

func main() {
    foo()
    fmt.Println("Waiting for goroutine to finish")
    wg.Wait()
    fmt.Println("All goroutine to finished")
}