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 time.Parse和time.Format的时区问题
Apr 29 Golang
Go 在 MongoDB 中常用查询与修改的操作
May 07 Golang
基于Golang 高并发问题的解决方案
May 08 Golang
go语言使用Casbin实现角色的权限控制
Jun 26 Golang
golang中字符串MD5生成方式总结
Jul 04 Golang
Golang中channel的原理解读(推荐)
Oct 16 Golang
golang为什么要统一错误处理
Apr 03 Golang
Go语言安装并操作redis的go-redis库
Apr 14 Golang
golang连接MySQl使用sqlx库
Apr 14 Golang
Go语言入门exec的基本使用
May 20 Golang
Go调用Rust方法及外部函数接口前置
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
浅析get与post的一些特殊情况
2014/07/28 PHP
ThinkPHP调试模式与日志记录概述
2014/08/22 PHP
PHP图像裁剪缩略裁切类源码及使用方法
2016/01/07 PHP
jQuery1.4.2与老版本json格式兼容的解决方法
2011/02/12 Javascript
jquery中focus()函数实现当对象获得焦点后自动把光标移到内容最后
2013/09/29 Javascript
从js向Action传中文参数出现乱码问题的解决方法
2013/12/29 Javascript
JS实现图片产生波纹一样flash效果的方法
2015/02/27 Javascript
javascript操作Cookie(设置、读取、删除)方法详解
2015/03/18 Javascript
javascript实现拖动元素交换位置
2015/11/29 Javascript
深入浅析JavaScript中with语句的理解
2016/05/12 Javascript
JS中常用的输出方式(五种)
2016/06/12 Javascript
JavaScript蒙板(model)功能的简单实现代码
2016/08/04 Javascript
Bootstrap CSS组件之按钮组(btn-group)
2016/12/17 Javascript
jquery实现全选、全不选以及单选功能
2017/03/23 jQuery
微信小程序页面传值实例分析
2017/04/19 Javascript
bootstrap timepicker在angular中取值并转化为时间戳
2017/06/13 Javascript
vue实现手机号码抽奖上下滚动动画示例
2017/10/18 Javascript
详解Vue2 添加对scss的支持
2019/01/02 Javascript
vuex实现及简略解析(小结)
2019/03/01 Javascript
mpvue实现小程序签到金币掉落动画(api实现)
2019/10/17 Javascript
详解Vue的watch中的immediate与watch是什么意思
2019/12/30 Javascript
微信小程序之高德地图多点路线规划过程示例详解
2021/01/18 Javascript
在nodejs中创建child process的方法
2021/01/26 NodeJs
python实现系统状态监测和故障转移实例方法
2013/11/18 Python
python实现猜数字游戏(无重复数字)示例分享
2014/03/29 Python
web.py在SAE中的Session问题解决方法(使用mysql存储)
2015/06/24 Python
Python导出DBF文件到Excel的方法
2015/07/25 Python
python MNIST手写识别数据调用API的方法
2018/08/08 Python
python 多线程对post请求服务器测试并发的方法
2019/06/13 Python
基于python plotly交互式图表大全
2019/12/07 Python
什么是python的id函数
2020/06/11 Python
Python 必须了解的5种高级特征
2020/09/10 Python
团日活动策划书
2014/02/01 职场文书
小学生评语集锦
2014/04/18 职场文书
大学中国梦演讲稿
2014/04/23 职场文书
yyds什么意思?90后已经听不懂00后讲话了……
2022/02/03 杂记