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判断key是否在map中的代码
Apr 24 Golang
基于go interface{}==nil 的几种坑及原理分析
Apr 24 Golang
go语言-在mac下brew升级golang
Apr 25 Golang
Go标准容器之Ring的使用说明
May 05 Golang
go 实现简易端口扫描的示例
May 22 Golang
Golang中channel的原理解读(推荐)
Oct 16 Golang
Golang 对es的操作实例
Apr 20 Golang
详解Go语言中Get/Post请求测试
Jun 01 Golang
Go调用Rust方法及外部函数接口前置
Jun 14 Golang
Go微服务项目配置文件的定义和读取示例详解
Jun 21 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
一个可查询所有表的“通用”查询分页类
2006/10/09 PHP
模仿OSO的论坛(二)
2006/10/09 PHP
PHP 获取 ping 时间的实现方法
2017/09/29 PHP
Bootstrap+PHP实现多图上传功能实例详解
2018/04/08 PHP
Mootools 1.2教程 选项卡效果(Tabs)
2009/09/15 Javascript
js前台分页显示后端JAVA数据响应
2013/03/18 Javascript
jQuery简单几行代码实现tab切换
2015/03/10 Javascript
jQuery实现限制textarea文本框输入字符数量的方法
2015/05/28 Javascript
js实现加载更多功能实例
2016/10/27 Javascript
遍历json获得数据的几种方法小结
2017/01/21 Javascript
详解node.js 下载图片的 2 种方式
2018/03/02 Javascript
纯JS实现的读取excel文件内容功能示例【支持所有浏览器】
2018/06/23 Javascript
NodeJs入门教程之定时器和队列
2019/03/08 NodeJs
浅谈Vue.js 关于页面加载完成后执行一个方法的问题
2019/04/01 Javascript
layui清空,重置表单数据的实例
2019/09/12 Javascript
Bootstrap table 实现树形表格联动选中联动取消功能
2019/09/30 Javascript
[37:45]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS Orenda
2014/05/22 DOTA
Python实现自动添加脚本头信息的示例代码
2016/09/02 Python
python 读取竖线分隔符的文本方法
2018/12/20 Python
TensorFlow tf.nn.conv2d_transpose是怎样实现反卷积的
2020/04/20 Python
Python实现封装打包自己写的代码,被python import
2020/07/12 Python
html5声频audio和视频video等新特性详细说明
2012/12/26 HTML / CSS
毕业证丢失证明
2014/01/15 职场文书
网吧最新创业计划书范文
2014/03/27 职场文书
商铺租赁意向书
2014/04/01 职场文书
《长城和运河》教学反思
2014/04/14 职场文书
小学生国庆65周年演讲稿范文(2篇)
2014/09/21 职场文书
个人学习群众路线心得体会
2014/11/05 职场文书
2014年会计主管工作总结
2014/12/20 职场文书
销售员自我评价
2015/03/11 职场文书
2015年民主评议党员工作总结
2015/05/19 职场文书
工作证明格式范文
2015/06/15 职场文书
Python趣味实战之手把手教你实现举牌小人生成器
2021/06/07 Python
MySQL创建管理LIST分区
2022/04/13 MySQL
html网页引入svg图片的4种方式
2022/08/05 HTML / CSS
js基于div丝滑实现贝塞尔曲线
2022/09/23 Javascript