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 相关文章推荐
Go Gin实现文件上传下载的示例代码
Apr 02 Golang
goland 清除所有的默认设置操作
Apr 28 Golang
浅谈golang package中init方法的多处定义及运行顺序问题
May 06 Golang
解决Goland 同一个package中函数互相调用的问题
May 06 Golang
golang 实现并发求和
May 08 Golang
Go语言应该什么情况使用指针
Jul 25 Golang
Go语言的协程上下文的几个方法和用法
Apr 11 Golang
Golang 结构体数据集合
Apr 22 Golang
Golang 入门 之url 包
May 04 Golang
Go本地测试解耦任务拆解及沟通详解Go本地测试的思路沟通的重要性总结
Jun 21 Golang
go goth封装第三方认证库示例详解
Aug 14 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
php中使用Imagick实现图像直方图的实现代码
2011/08/30 PHP
PHP实现算式验证码和汉字验证码实例
2015/03/09 PHP
jquery中dom操作和事件的实例学习 仿yahoo邮箱登录框的提示效果
2011/11/30 Javascript
JS实现将人民币金额转换为大写的示例代码
2014/02/13 Javascript
javascript模拟订火车票和退票示例
2014/04/24 Javascript
node.js中的fs.utimesSync方法使用说明
2014/12/15 Javascript
jQuery实现html表格动态添加新行的方法
2015/05/28 Javascript
Jquery获取第一个子元素简单实例
2016/06/02 Javascript
jQuery使用正则表达式限制文本框只能输入数字
2016/06/18 Javascript
AngularJS模仿Form表单提交的实现代码
2016/12/08 Javascript
微信小程序dom操作的替代思路实例分析
2018/12/06 Javascript
vue使用prop可以渲染但是打印台报错的解决方式
2019/11/13 Javascript
在Vue中实现随hash改变响应菜单高亮
2020/03/09 Javascript
Vue路由的模块自动化与统一加载实现
2020/06/05 Javascript
js实现幻灯片轮播图
2020/08/14 Javascript
[50:27]Secret vs VG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
使用python删除nginx缓存文件示例(python文件操作)
2014/03/26 Python
python 实现网上商城,转账,存取款等功能的信用卡系统
2016/07/15 Python
TensorFlow神经网络优化策略学习
2018/03/09 Python
对python中矩阵相加函数sum()的使用详解
2019/01/28 Python
Python3.5内置模块之random模块用法实例分析
2019/04/26 Python
浅谈Python中(&amp;,|)和(and,or)之间的区别
2019/08/07 Python
Python3搭建http服务器的实现代码
2020/02/11 Python
python3.4中清屏的处理方法
2020/07/06 Python
python 中的9个实用技巧,助你提高开发效率
2020/08/30 Python
详解css3自定义滚动条样式写法
2017/12/25 HTML / CSS
html5教程实现Photoshop渐变色效果
2013/12/04 HTML / CSS
夜大毕业生自我评价分享
2013/11/10 职场文书
体育教师自荐信范文
2013/12/16 职场文书
主持人演讲稿范文
2013/12/28 职场文书
学生拾金不昧表扬信
2014/01/21 职场文书
刑事附带民事上诉状
2015/05/23 职场文书
运动会班级前导词
2015/07/20 职场文书
Apache Hudi的多版本清理服务彻底讲解
2022/03/31 Servers
Centos系统通过Docker安装并搭建MongoDB数据库
2022/04/12 MongoDB
Docker安装MySql8并远程访问的实现
2022/07/07 Servers