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 interface判断为空nil的实现代码
Apr 24 Golang
解决Golang中ResponseWriter的一个坑
Apr 27 Golang
golang elasticsearch Client的使用详解
May 05 Golang
go设置多个GOPATH的方式
May 05 Golang
golang switch语句的灵活写法介绍
May 06 Golang
Go语言空白表示符_的实例用法
Jul 04 Golang
Go语言应该什么情况使用指针
Jul 25 Golang
Golang并发操作中常见的读写锁详析
Aug 30 Golang
golang生成并解析JSON
Apr 14 Golang
Golang 字符串的常见操作
Apr 19 Golang
GoFrame gredis缓存DoVar Conn连接对象 自动序列化GoFrame gredisDo/DoVar方法Conn连接对象自动序列化/反序列化总结
Jun 14 Golang
GoFrame框架数据校验之校验结果Error接口对象
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
PHP header()函数使用详细(301、404等错误设置)
2013/04/17 PHP
WordPress中用于获取文章信息以及分类链接的函数用法
2015/12/18 PHP
yii2控制器Controller Ajax操作示例
2016/07/23 PHP
php使用include 和require引入文件的区别
2017/02/16 PHP
Yii框架多语言站点配置方法分析【中文/英文切换站点】
2020/04/07 PHP
Mootools 1.2教程 滚动条(Slider)
2009/09/15 Javascript
无缝滚动改进版支持上下左右滚动(封装成函数)
2012/12/04 Javascript
js获取网页可见区域、正文以及屏幕分辨率的高度
2014/05/15 Javascript
JavaScript多并发问题如何处理
2015/10/28 Javascript
JavaScript实现简单Tip提示框效果
2016/04/20 Javascript
jQuery插件easyUI实现通过JS显示Dialog的方法
2016/09/16 Javascript
HTML5基于Tomcat 7.0实现WebSocket连接并实现简单的实时聊天
2016/10/31 Javascript
前端实现文件的断点续传(前端文件提交+后端PHP文件接收)
2016/11/04 Javascript
Angularjs的Controller间通信机制实例分析
2016/11/07 Javascript
微信小程序中实现手指缩放图片的示例代码
2018/03/13 Javascript
在小程序开发中使用npm的方法
2018/10/17 Javascript
如何在基于vue-cli的项目自定义打包环境
2018/11/10 Javascript
vue cli3.0 引入eslint 结合vscode使用
2019/05/27 Javascript
vue实现分环境打包步骤(给不同的环境配置相对应的打包命令)
2019/06/04 Javascript
详解JavaScript 浮点数运算的精度问题
2019/07/23 Javascript
layui实现数据表格点击搜索功能
2020/03/26 Javascript
详解JavaScript中的链式调用
2020/11/27 Javascript
[03:07]DOTA2英雄基础教程 冰霜诅咒极寒幽魂
2013/12/06 DOTA
[02:09]EHOME夺得首届辉夜杯冠军—现场颁奖仪式
2015/12/28 DOTA
django基础之数据库操作方法(详解)
2017/05/24 Python
Python基于lxml模块解析html获取页面内所有叶子节点xpath路径功能示例
2018/05/16 Python
python numpy中cumsum的用法详解
2019/10/17 Python
python实现简易淘宝购物
2019/11/22 Python
Python实现不规则图形填充的思路
2020/02/02 Python
一些常用的HTML5模式(pattern) 总结
2015/07/14 HTML / CSS
施华洛世奇德国官网:SWAROVSKI德国
2017/02/01 全球购物
失恋33天观后感
2015/06/11 职场文书
签约仪式致辞
2015/07/30 职场文书
掌握这项技巧,一年阅读300本书不是梦
2019/09/12 职场文书
Win11怎样将锁屏账户头像图片改成动画视频
2021/11/21 数码科技
二维码条形码生成的JavaScript脚本库
2022/07/07 Javascript