文章目录
main goroutine结束,子goroutine立即结束
package main
import (
"fmt"
"time"
)
func main() {
// main函数中goroutine如果结束,子goroutine不会再执行
fmt.Println("main函数开始")
go func() {
time.Sleep(1 * time.Second)
fmt.Println("main中子goroutine结束")
}()
fmt.Println("main函数结束")
}
/*
main函数开始
main函数结束
*/
这段带代码,子goroutine的“fmt.Println(“main中子goroutine结束”)”没有执行。即main goroutine结束,子goroutine立即结束。
平时测试都是在main函数测试,即main goroutine结束,子goroutine立即结束。给人造成了父goroutien结束,子goroutine也要理解结束的假象。实际却不是这样的。
main函数如果不结束,父函数即使结束,父函数中的goroutine也会执行
package main
import (
"fmt"
"time"
)
func main() {
// main函数如果不结束,父函数即使结束,父函数中的goroutine也会执行
fmt.Println("main函数开始")
notMainFunc()
time.Sleep(3 * time.Second)
fmt.Println("main函数结束")
}
func notMainFunc() {
fmt.Println("notMainFunc开始")
go func() {
time.Sleep(1 * time.Second)
println("notMainFunc中子goroutine结束")
}()
fmt.Println("notMainFunc结束")
}
/*
main函数开始
notMainFunc开始
notMainFunc结束
notMainFunc中子goroutine结束
main函数结束
*/
上面的例子,main函数没结束之前,即使父函数结束,父函数中的子goroutine也会继续执行。
main函数如果不结束,父goroutine即使结束,父goroutine中的子goroutine也会执行
package main
import (
"fmt"
"time"
)
func main() {
// main函数如果不结束,父goroutine即使结束,父goroutine中的子goroutine也会执行
fmt.Println("main函数开始")
go notMainFunc()
time.Sleep(3 * time.Second)
fmt.Println("main函数结束")
}
func notMainFunc() {
fmt.Println("notMainFunc开始")
go func() {
time.Sleep(1 * time.Second)
println("notMainFunc中子goroutine结束")
}()
fmt.Println("notMainFunc结束")
}
/*
main函数开始
notMainFunc开始
notMainFunc结束
notMainFunc中子goroutine结束
main函数结束
*/
结论
只要main函数不结束,子goroutine会一直执行
main函数结束,子goroutine会立即结束