Go语言 go程释放操作(退出/销毁)


Posted in Golang onApril 30, 2021

情况1:

Go语言中,若在子go程中创建一个新 go程,子go程释放(销毁),新创建的go程不会随着子go程的销毁而销毁。

原因:

go程共享堆,不共享栈,go程由程序员在go的代码里显示调度(释放)。

实例:

package main
import (
	"fmt"
	"time"
	"runtime"
)
func test()  {
	for i:=0;i<10;i++{
		fmt.Printf("执行第%d次go程\n",i)
		time.Sleep(time.Second)
	}
	fmt.Println("go程执行完毕!")
}
func main() {
	go func() {
		go test()
		fmt.Println("------aaaaaaaa-------")
		time.Sleep(time.Second)
		fmt.Println("------go程结束--------------")
		/*
		   不管是return  还是  runtime.Goexit(),效果一样
		*/
		//return
		runtime.Goexit()
 
	}()
	for{
		runtime.GC()
	}
}

Go语言 go程释放操作(退出/销毁)

从以上实例来看,虽然子go程已经退出,但是在子go程中新建的go程还在执行!原因:go程不共享栈,有自己独立的栈空间。子go程有自己的栈,在子go程中创建的新go程也有自己的栈。

子go程的栈被释放(回收),由于栈独立,因此新创建的go程的栈不会被释放。

情况2:

Go语言中,若在主go程中创建一个新 go程,主go程释放(销毁),新创建的go程随着主go程的销毁而销毁。

原因:

go程共享堆,不共享栈,go程由程序员在go的代码里显示调度(释放)。

实例:

package main
 
import (
	"fmt"
	"time"
)
func main() {
	go func() {
		for i:=0;i<10;i++{
			fmt.Printf("子go程:执行第%d次操作!\n",i)
			time.Sleep(time.Second)
		}
	}()
	for i:=0;i<3;i++{
		fmt.Println("--------aaaa------")
		time.Sleep(time.Second)
	}
}

Go语言 go程释放操作(退出/销毁)

从以上实例来看,虽然主go程退出,子go程马上退出。原因:go程共享堆。主go程和新创建的子go程共享一个堆。主go程退出,执行main对应的{ },堆退出。由于是共享堆,所以对应的子go程也会被销毁。

补充:go基础之服务退出问题

最近学习公司微服务的代码,看到每一个微服务的main函数都阻塞在那里,然后里面起的goroutine一直在哪里运行。

package main
import(
    "fmt"
    "os"
    "os/signal"
    "syscall"
    "log"
    "time"
)
func testFunc() error {
    go func(){
        for{
           fmt.Printf("testing....\n")
           time.Sleep(time.Minute)
        }
    }()
    return nil
}
func exitFunc(){
    fmt.Println("i am exiting!")
}
func main(){
    logger := log.New(os.Stdout, "[TestGoroutine]", log.Lshortfile | log.Ldate | log.Ltime) //初始化日志
    exit := make(chan os.Signal,10) //初始化一个channel
    signal.Notify(exit, syscall.SIGINT, syscall.SIGTERM) //notify方法用来监听收到的信号
    testFunc()
    sig := <-exit
    logger.Printf("%s",sig.String())
    exitFunc()
}

代码输出

[root@localhost demoproject]# go run test.go

testing....

^C[TestGoroutine]2018/07/31 19:26:14 test.go:36: interrupt

i am exiting!

可以看到知道按了ctrl+c之后才退出main函数的运行。然后goroutine随之停止运行。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。如有错误或未考虑完全的地方,望不吝赐教。

Golang 相关文章推荐
golang 实现菜单树的生成方式
Apr 28 Golang
对Golang中的FORM相关字段理解
May 02 Golang
golang 实现Location跳转方式
May 02 Golang
解决golang结构体tag编译错误的问题
May 02 Golang
go设置多个GOPATH的方式
May 05 Golang
Go标准容器之Ring的使用说明
May 05 Golang
Golang标准库syscall详解(什么是系统调用)
May 25 Golang
go select编译期的优化处理逻辑使用场景分析
Jun 28 Golang
golang内置函数len的小技巧
Jul 25 Golang
Go获取两个时区的时间差
Apr 20 Golang
Golang 实现WebSockets
Apr 24 Golang
Golang 实现 WebSockets 之创建 WebSockets
Apr 24 Golang
golang DNS服务器的简单实现操作
golang slice元素去重操作
Apr 30 #Golang
Golang中interface{}转为数组的操作
Apr 30 #Golang
解决Go gorm踩过的坑
Apr 30 #Golang
Golang 如何实现函数的任意类型传参
Apr 29 #Golang
解决Golang time.Parse和time.Format的时区问题
Apr 29 #Golang
Golang 使用Map实现去重与set的功能操作
Apr 29 #Golang
You might like
探讨Hessian在PHP中的使用分析
2013/06/13 PHP
Zend Framework校验器Zend_Validate用法详解
2016/12/09 PHP
Laravel中的Auth模块详解
2017/08/17 PHP
golang实现php里的serialize()和unserialize()序列和反序列方法详解
2018/10/30 PHP
IE的fireEvent方法概述及应用
2013/02/22 Javascript
caller和callee的区别介绍及演示结果
2013/03/10 Javascript
Javascript对象属性方法汇总
2013/11/21 Javascript
JS字符串拼接在ie中都报错的解决方法
2014/03/27 Javascript
jquery处理json对象
2014/11/03 Javascript
jquery ajax双击div可直接修改div中的内容
2016/03/04 Javascript
JS平滑无缝滚动效果的实现代码
2016/05/06 Javascript
辨析JavaScript中的Undefined类型与null类型
2016/05/26 Javascript
js注入 黑客之路必备!
2016/09/14 Javascript
Bootstrap导航条鼠标悬停下拉菜单
2017/01/04 Javascript
vue-cli初始化项目中使用less的方法
2018/08/09 Javascript
js事件触发操作实例分析
2019/06/21 Javascript
微信小程序tabBar设置实例解析
2019/11/14 Javascript
jquery 插件重新绑定的处理方法分析
2019/11/23 jQuery
Vue路由管理器Vue-router的使用方法详解
2020/02/05 Javascript
Vue SSR 即时编译技术的实现
2020/05/06 Javascript
详解Typescript里的This的使用方法
2021/01/08 Javascript
Python的ORM框架SQLObject入门实例
2014/04/28 Python
python中查看变量内存地址的方法
2015/05/05 Python
Python反射用法实例简析
2017/12/22 Python
Python实现批量压缩图片
2018/01/25 Python
win8.1安装Python 2.7版环境图文详解
2019/07/01 Python
Django Form 实时从数据库中获取数据的操作方法
2019/07/25 Python
哪种Python框架适合你?简单介绍几种主流Python框架
2020/08/04 Python
财务管理专业自荐信范文
2013/12/24 职场文书
2014全国两会心得体会
2014/03/17 职场文书
令人印象深刻的自荐信
2014/05/25 职场文书
学风建设演讲稿
2014/09/12 职场文书
出差报告怎么写
2014/11/06 职场文书
汽车销售员工作总结
2015/08/12 职场文书
2016元旦晚会主持词开场白和结束语
2015/12/04 职场文书
护士业务学习心得体会
2016/01/25 职场文书