给出以下伪代码:
func main() {
go runFuncOne()
}
func runFuncOne() bool {
runFuncTwo()
return true
}
func runFuncTwo() bool {
// Do some heavy work
return true
}
runFuncTwo
只会阻止runFuncOne
(调用goroutine)或runFuncTwo
阻止main()
因为它本身不是作为goroutine运行的吗?
我的假设是,main()
会打开一个帖子,runFuncOne()
和runFuncTwo()
将在其中运行。在runFuncTwo()
内执行的任何工作都只会阻止此runFuncOne()
的实例?
答案 0 :(得分:1)
runFuncTwo仅阻止runFuncOne,因为它们都在单独的Go例程中运行。
请注意,main()因此会继续并退出,导致程序退出。要避免这种情况并完成所有runFuncTwo,您应该使用sync.WaitGroup。
答案 1 :(得分:1)
The Go Programming Language Specification
功能值和参数按照常规进行评估 调用goroutine,但不像常规调用,程序执行 不等待调用的函数完成。相反, 函数在新的goroutine中独立开始执行。当。。。的时候 函数终止,其goroutine也终止。如果功能 有任何返回值,它们在函数完成时被丢弃。
func main() {
go runFuncOne()
}
main
将调用runFuncOne()
作为goroutine,然后立即退出程序,终止runFuncOne()
而不等待它完成。
func runFuncOne() bool {
runFuncTwo()
return true
}
func runFuncTwo() bool {
// Do some heavy work
return true
}
runFuncOne()
对runFuncTwo()
进行函数调用,以便等待runFuncTwo()
完成。
答案 2 :(得分:1)
还可以使用频道进行同步:
package main
import (
"fmt"
"time"
)
func main() {
var ch chan int = make(chan int)
go runFuncOne(ch)
fmt.Println("Waiting..")
fmt.Println(<-ch)
}
func runFuncOne(ch chan int) {
runFuncTwo(ch)
ch <- 1
}
func runFuncTwo(ch chan int) bool {
time.Sleep(1 * time.Second)
fmt.Println("Done working..")
return true
}
https://play.golang.org/p/h1S4TSdT0w
runFuncOne
的返回类型如果您通过go例程调用它将不会产生后果。