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 正则匹配效率详解
Apr 25 Golang
Go语言中的UTF-8实现
Apr 26 Golang
基于Go Int转string几种方式性能测试
Apr 28 Golang
彻底理解golang中什么是nil
Apr 29 Golang
浅谈Golang 嵌套 interface 的赋值问题
Apr 29 Golang
golang协程池模拟实现群发邮件功能
May 02 Golang
goland设置颜色和字体的操作
May 05 Golang
Golang: 内建容器的用法
May 05 Golang
手把手教你导入Go语言第三方库
Aug 04 Golang
Golang使用Panic与Recover进行错误捕获
Mar 22 Golang
Go归并排序算法的实现方法
Apr 06 Golang
Golang 链表的学习和使用
Apr 19 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中$this-&amp;gt;含义分析
2009/11/29 PHP
php保存任意网络图片到服务器的方法
2015/04/14 PHP
laravel中的错误与日志用法详解
2016/07/26 PHP
Thinkphp5.0自动生成模块及目录的方法详解
2017/04/17 PHP
基于jQuery的让非HTML5浏览器支持placeholder属性的代码
2011/05/24 Javascript
js原生态函数中使用jQuery中的 $(this)无效的解决方法
2011/05/25 Javascript
JS上传前预览图片实例
2013/03/25 Javascript
js绑定事件this指向发生改变的问题解决方法
2013/04/23 Javascript
JavaScript 命名空间 使用介绍
2013/08/29 Javascript
用html5 js实现点击一个按钮达到浏览器全屏效果
2014/05/28 Javascript
javascript事件冒泡实例分析
2015/05/13 Javascript
mvvm双向绑定机制的原理和实现代码(推荐)
2016/06/07 Javascript
JS常见创建类的方法小结【工厂方式,构造器方式,原型方式,联合方式等】
2017/04/01 Javascript
vue 组件中添加样式不生效的解决方法
2018/07/06 Javascript
jQuery实现适用于移动端的跑马灯抽奖特效示例
2019/01/18 jQuery
javascript原型链学习记录之继承实现方式分析
2019/05/01 Javascript
Vue 实现对quill-editor组件中的工具栏添加title
2020/08/03 Javascript
Nodejs在局域网配置https访问的实现方法
2020/10/17 NodeJs
python中定义结构体的方法
2013/03/04 Python
python设置值及NaN值处理方法
2018/07/03 Python
python Django里CSRF 对应策略详解
2019/08/05 Python
python读取mysql数据绘制条形图
2020/03/25 Python
解决 jupyter notebook 回车换两行问题
2020/04/15 Python
python批量生成身份证号到Excel的两种方法实例
2021/01/14 Python
SpringBoot首页设置解析(推荐)
2021/02/11 Python
Python3爬虫RedisDump的安装步骤
2021/02/20 Python
css3和jquery实现的可折叠导航菜单适合放在手机网页的导航菜单
2014/09/02 HTML / CSS
css3 伪类选择器快速复习小结
2019/09/10 HTML / CSS
墨西哥运动服饰和鞋网上商店:Netshoes墨西哥
2016/07/28 全球购物
普通话宣传标语
2014/06/26 职场文书
树转促学习心得体会
2014/09/10 职场文书
施工安全协议书范本
2014/09/26 职场文书
维稳工作承诺书
2015/01/20 职场文书
详解MySQL 用户权限管理
2021/04/20 MySQL
一文搞清楚MySQL count(*)、count(1)、count(col)区别
2022/03/03 MySQL
python对文档中元素删除,替换操作
2022/04/02 Python