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中semaphore(信号量)源码
Apr 03 Golang
goland 清除所有的默认设置操作
Apr 28 Golang
golang日志包logger的用法详解
May 05 Golang
解决golang 关于全局变量的坑
May 06 Golang
基于Golang 高并发问题的解决方案
May 08 Golang
Golang二维数组的使用方式
May 28 Golang
深入理解go缓存库freecache的使用
Feb 15 Golang
如何解决goland,idea全局搜索快捷键失效问题
Apr 03 Golang
Golang 实现 WebSockets 之创建 WebSockets
Apr 24 Golang
在ubuntu下安装go开发环境的全过程
Aug 05 Golang
Python测试框架pytest核心库pluggy详解
Aug 05 Golang
Go gorilla securecookie库的安装使用详解
Aug 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中JSON数据操作
2015/07/01 PHP
利用php实现一周之内自动登录存储机制(cookie、session、localStorage)
2016/10/31 PHP
js基于qrcode.js生成二维码的方法【附demo插件源码下载】
2016/12/28 PHP
PHP基于array_unique实现二维数组去重
2020/07/14 PHP
js下弹出窗口的变通
2007/04/18 Javascript
Json对象与Json字符串互转(4种转换方式)
2013/03/27 Javascript
如何使用jquery动态加载js,css文件实现代码
2013/04/03 Javascript
javascript得到当前页的来路即前一页地址的方法
2014/02/18 Javascript
JS替换文本域内的回车示例
2014/02/18 Javascript
javaScript实现滚动新闻的方法
2015/07/30 Javascript
JavaScript实现的多个图片广告交替显示效果代码
2015/09/04 Javascript
详解js图片轮播效果实现原理
2015/12/17 Javascript
JavaScript位置与大小(1)之正确理解和运用与尺寸大小相关的DOM属性
2015/12/26 Javascript
JavaScript通过代码调用Flash显示的方法
2016/02/02 Javascript
谈一谈js中的执行环境及作用域
2016/03/30 Javascript
JavaScript Math 对象常用方法总结
2016/04/28 Javascript
jQuery之动画ajax事件(实例讲解)
2017/07/18 jQuery
JS+Canvas绘制动态时钟效果
2017/11/10 Javascript
通过C++学习Python
2015/01/20 Python
Python类定义和类继承详解
2015/05/08 Python
Python读取图片属性信息的实现方法
2016/09/11 Python
Python文件和流(实例讲解)
2017/09/12 Python
pycharm下查看python的变量类型和变量内容的方法
2018/06/26 Python
Python离线安装PIL 模块的方法
2019/01/08 Python
Python3中urlencode和urldecode的用法详解
2019/07/23 Python
TensorFlow实现打印每一层的输出
2020/01/21 Python
Python字符串格式化常用手段及注意事项
2020/06/17 Python
django前端页面下拉选择框默认值设置方式
2020/08/09 Python
python将字典内容写入json文件的实例代码
2020/08/12 Python
DHC中国官方购物网站:日本通信销售No.1化妆品
2016/08/20 全球购物
Jabra捷波朗美国官网:用于办公、车载和运动的无线蓝牙耳麦
2017/02/01 全球购物
奶茶专卖店创业计划书
2014/01/18 职场文书
大学三年计划书范文
2014/04/30 职场文书
地方课程教学计划
2015/01/19 职场文书
行政主管岗位职责
2015/02/03 职场文书
小王子读书笔记
2015/06/29 职场文书