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语言map与string的相互转换的实现
Apr 07 Golang
基于go interface{}==nil 的几种坑及原理分析
Apr 24 Golang
Go语言带缓冲的通道实现
Apr 26 Golang
golang import自定义包方式
Apr 29 Golang
Golang 使用Map实现去重与set的功能操作
Apr 29 Golang
goland设置颜色和字体的操作
May 05 Golang
golang switch语句的灵活写法介绍
May 06 Golang
解决goland 导入项目后import里的包报红问题
May 06 Golang
GoLang中生成UUID唯一标识的实现
May 08 Golang
golang语言指针操作
Apr 14 Golang
GoFrame gredis缓存DoVar Conn连接对象 自动序列化GoFrame gredisDo/DoVar方法Conn连接对象自动序列化/反序列化总结
Jun 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中读取文件的8种方法和代码实例
2014/08/05 PHP
PHP的Yii框架中创建视图和渲染视图的方法详解
2016/03/29 PHP
遍历echsop的region表形成缓存的程序实例代码
2016/11/01 PHP
php-fpm添加service服务的例子
2018/04/27 PHP
检测input每次的输入是否合法遇到汉字输入就有问题
2012/05/23 Javascript
解析JavaScript中的标签语句
2013/06/19 Javascript
js弹出div并显示遮罩层
2014/02/12 Javascript
Jquery实现仿腾讯微博发表广播
2014/11/17 Javascript
jQuery动画_动力节点节点Java学院整理
2017/07/04 jQuery
BootStrap给table表格的每一行添加一个按钮事件
2017/09/07 Javascript
js获取html页面代码中图片地址的实现代码
2018/03/05 Javascript
vue router 跳转时打开新页面的示例方法
2019/07/28 Javascript
Ant Design的Table组件去除
2020/10/24 Javascript
[03:24]CDEC.Y赛前采访 努力备战2016国际邀请赛中国区预选赛
2016/06/25 DOTA
[01:30:55]VG vs Mineski Supermajor 败者组 BO3 第三场 6.6
2018/06/07 DOTA
[51:36]Optic vs Newbee 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
跟老齐学Python之做一个小游戏
2014/09/28 Python
将Django框架和遗留的Web应用集成的方法
2015/07/24 Python
Python实现简单多线程任务队列
2016/02/27 Python
基于Python实现一个简单的银行转账操作
2016/03/06 Python
Python用户推荐系统曼哈顿算法实现完整代码
2017/12/01 Python
django2 快速安装指南分享
2018/01/05 Python
python 拷贝特定后缀名文件,并保留原始目录结构的实例
2018/04/27 Python
tensorflow实现简单的卷积网络
2018/05/24 Python
解决python 读取excel时 日期变成数字并加.0的问题
2019/10/08 Python
Python 中的 import 机制之实现远程导入模块
2019/10/29 Python
详解Django admin高级用法
2019/11/06 Python
python如何运行js语句
2020/09/09 Python
使用pandas读取表格数据并进行单行数据拼接的详细教程
2021/03/03 Python
C/C++程序员常见面试题一
2012/12/08 面试题
四年大学生活的自我评价范文
2014/02/07 职场文书
2014年庆元旦活动方案
2014/02/15 职场文书
政风行风整改方案
2014/10/25 职场文书
本科毕业论文指导教师评语
2014/12/30 职场文书
顶岗实习协议书
2015/01/29 职场文书
中学图书馆工作总结
2015/08/11 职场文书