前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go程是如何创建和何时销毁的?

Go程是如何创建和何时销毁的?

作者头像
LIYI
发布2021-01-21 19:13:09
9380
发布2021-01-21 19:13:09
举报
文章被收录于专栏:艺述论专栏艺述论专栏

Go程如何创建?

通过go关键字进行创建,看一下代码,很简单:

代码语言:javascript
复制
go test(j) // test是一个函数

Go程如何销毁,何时销毁?

创建一个Go程简单,但何时销毁呢?这个问题稍微有点复杂,看个代码先:

代码语言:javascript
复制
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

输出:

代码语言:javascript
复制
主程暂停
  子子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程也就退出了,不能再执行了。上面的程序最后几行如果修改为:

代码语言:javascript
复制
println("主程暂停")
// time.Sleep(time.Second)
println("主程结束")
runtime.GC()

源码见:go-easy/Go程/main2.go

输出则是:

代码语言:javascript
复制
主程暂停
主程结束
  子子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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 艺述论 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Go程如何创建?
  • Go程如何销毁,何时销毁?
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档