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中实现给gif、png、jpeg图片添加文字水印
Apr 26 Golang
golang中切片copy复制和等号复制的区别介绍
Apr 27 Golang
解决Golang中goroutine执行速度的问题
May 02 Golang
Go 自定义package包设置与导入操作
May 06 Golang
Golang中异常处理机制详解
Jun 08 Golang
一文搞懂Golang 时间和日期相关函数
Dec 06 Golang
GO语言字符串处理函数之处理Strings包
Apr 14 Golang
Golang入门之计时器
May 04 Golang
Golang并发工具Singleflight
May 06 Golang
详解Go语言中配置文件使用与日志配置
Jun 01 Golang
Go微服务项目配置文件的定义和读取示例详解
Jun 21 Golang
Go语言编译原理之源码调试
Aug 05 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中数据库单例模式的实现代码分享
2014/08/21 PHP
9条PHP编程小知识及易犯的小错误
2015/01/22 PHP
如何在PHP环境中使用ProtoBuf数据格式
2020/06/19 PHP
javascript 写的一个简单的timer
2009/07/30 Javascript
JS获取父节点方法
2009/08/20 Javascript
js 编程笔记 无名函数
2011/06/28 Javascript
js window.print实现打印特定控件或内容
2013/09/16 Javascript
Yii2使用Bootbox插件实现自定义弹窗
2015/04/02 Javascript
jquery实现用户打分评分特效
2015/05/28 Javascript
js实现文本框只允许输入数字并限制数字大小的方法
2015/08/19 Javascript
jQuery+Ajax实现无刷新分页
2015/10/30 Javascript
基于jquery实现省市联动特效
2015/12/17 Javascript
JavaScript实现99乘法表及隔行变色实例代码
2016/02/24 Javascript
Java框架SSH结合Easyui控件实现省市县三级联动示例解析
2016/06/12 Javascript
轻松掌握JavaScript代理模式
2016/08/26 Javascript
解析AngularJS中get请求URL出现的跨域问题
2016/12/01 Javascript
微信小程序 配置文件详细介绍
2016/12/14 Javascript
微信小程序实现换肤功能
2018/03/14 Javascript
浅析node.js的模块加载机制
2018/05/25 Javascript
vue项目刷新当前页面的三种方法
2018/12/04 Javascript
vue实现select下拉显示隐藏功能
2019/09/30 Javascript
vue表单中遍历表单操作按钮的显示隐藏示例
2019/10/30 Javascript
Vue实现导航栏的显示开关控制
2019/11/01 Javascript
vue动态设置路由权限的主要思路
2021/01/13 Vue.js
使用vue3重构拼图游戏的实现示例
2021/01/25 Vue.js
zbar解码二维码和条形码示例
2014/02/07 Python
PYTHON基础-时间日期处理小结
2018/05/05 Python
Python通过yagmail实现发送邮件代码解析
2020/10/27 Python
Python模拟登录和登录跳转的参考示例
2020/10/30 Python
如何用Python输出一个Fibonacci数列
2016/08/28 面试题
如何安装ruby on rails
2014/02/09 面试题
俞敏洪北大演讲稿
2014/05/22 职场文书
民事诉讼代理授权委托书
2014/10/11 职场文书
Python使用sql语句对mysql数据库多条件模糊查询的思路详解
2021/04/12 Python
go web 预防跨站脚本的实现方式
2021/06/11 Golang
教你怎么用Python实现GIF动图的提取及合成
2021/06/15 Python