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语言中json数据的读取和写出操作
Apr 28 Golang
浅谈Golang 嵌套 interface 的赋值问题
Apr 29 Golang
golang goroutine顺序输出方式
Apr 29 Golang
Go语言 go程释放操作(退出/销毁)
Apr 30 Golang
浅谈golang 中time.After释放的问题
May 05 Golang
golang 实现时间戳和时间的转化
May 07 Golang
基于Golang 高并发问题的解决方案
May 08 Golang
修改并编译golang源码的操作步骤
Jul 25 Golang
如何解决goland,idea全局搜索快捷键失效问题
Apr 03 Golang
Golang原生rpc(rpc服务端源码解读)
Apr 07 Golang
golang生成并解析JSON
Apr 14 Golang
golang语言指针操作
Apr 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网页游戏学习之Xnova(ogame)源码解读(二)
2014/06/23 PHP
php上传图片之时间戳命名(保存路径)
2014/08/15 PHP
驱动事件的addEvent.js代码
2007/03/27 Javascript
js 无提示关闭浏览器页面的代码
2010/03/09 Javascript
基于jquery的超简单上下翻
2010/04/20 Javascript
禁止页面刷新让F5快捷键及右键都无效
2014/01/22 Javascript
JavaScript中对象属性的添加和删除示例
2014/05/12 Javascript
js实现横向百叶窗效果网页切换动画效果的方法
2015/03/02 Javascript
js同源策略详解
2015/05/21 Javascript
详解JavaScript编程中正则表达式的使用
2015/10/25 Javascript
jQuery Mobile弹出窗、弹出层知识汇总
2016/01/05 Javascript
JavaScript数组方法大全(推荐)
2016/07/05 Javascript
详解AngularJs路由之Ui-router-resolve(预加载)
2017/06/13 Javascript
详解nodejs通过响应回写的方式渲染页面资源
2018/04/07 NodeJs
Javascript中弹窗confirm与prompt的区别
2018/10/26 Javascript
详解关于微信setData回调函数中的坑
2019/02/18 Javascript
nodejs提示:cross-device link not permitted, rename错误的解决方法
2019/06/10 NodeJs
Node.js API详解之 tty功能与用法实例分析
2020/04/27 Javascript
Python实现将MySQL数据库表中的数据导出生成csv格式文件的方法
2018/01/11 Python
Python多线程中阻塞(join)与锁(Lock)使用误区解析
2018/04/27 Python
Python 安装第三方库 pip install 安装慢安装不上的解决办法
2019/06/18 Python
Python OpenCV 调用摄像头并截图保存功能的实现代码
2019/07/02 Python
pandas 时间格式转换的实现
2019/07/06 Python
pycharm修改file type方式
2019/11/19 Python
Pandas —— resample()重采样和asfreq()频度转换方式
2020/02/26 Python
EM Cosmetics官网:由彩妆大神Michelle Phan创办的独立品牌
2020/04/27 全球购物
链表面试题-一个链表的结点结构
2015/05/04 面试题
物流专业专科生职业生涯规划书
2014/09/14 职场文书
校园安全广播稿范文
2014/09/25 职场文书
六一儿童节标语
2014/10/08 职场文书
2014年环境卫生工作总结
2014/11/24 职场文书
兴趣班停课通知
2015/04/24 职场文书
病假条格式范文
2015/08/17 职场文书
如何解决springcloud feign 首次调用100%失败的问题
2021/06/23 Java/Android
Go语言空白表示符_的实例用法
2021/07/04 Golang
一文了解MYSQL三大范式和表约束
2022/04/03 MySQL