通过go关键字进行创建,看一下代码,很简单:
go test(j) // test是一个函数
创建一个Go程简单,但何时销毁呢?这个问题稍微有点复杂,看个代码先:
package main
import (
"fmt"
"time"
// "runtime"
)
func test(j int) {
fmt.Printf(" 子子go程%d暂停1s\n",j)
time.Sleep(time.Second)
fmt.Printf(" 子子go程%d结束\n",j)
}
func main() {
go func() {
for j := 0; j < 3; j++ {
go test(j)
}
fmt.Println(" 子go程暂停1s")
time.Sleep(time.Second)
fmt.Println(" 子go程结束")
// 不管是return 还是runtime.Goexit(),
// 还是什么都没有,Go程及其栈,在函数退出时均会销毁
// return 会让Go程马上结束,后面的代码不会再执行
// 而什么也不写,默认执行到函数体代码的最后一行
// runtime.Goexit()
}()
println("主程暂停")
time.Sleep(time.Second*5)
println("主程结束")
}
源码见:go-easy/Go程/main1.go
输出:
主程暂停
子子go程0暂停1s
子go程暂停1s
子子go程2暂停1s
子子go程1暂停1s
子子go程1结束
子子go程2结束
子go程结束
子子go程0结束
主程结束
从输出来看是这样的,Go程共享堆,但不共享栈。一个子Go程退出时,它的栈会销毁,但这并不会影响在它的生命周期内创建的子子Go程。Go程的栈是相互独立的。
Go程共享的堆一旦销毁,所有子Go程,及子子Go程也就退出了,不能再执行了。上面的程序最后几行如果修改为:
println("主程暂停")
// time.Sleep(time.Second)
println("主程结束")
runtime.GC()
源码见:go-easy/Go程/main2.go
输出则是:
主程暂停
主程结束
子子go程0暂停1s
子go程暂停1s
子子go程2暂停1s
子子go程1暂停1s
所有后代Go程能得执行,但是不能结束,因为堆已经被销毁了。
我讲明白没有,欢迎留言。
2021年1月19日
所有源码见:https://gitee.com/rxyk/go-easy 源码示例修改自:https://blog.csdn.net/weixin_42117918/article/details/82318508