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 08 Golang
win10下go mod配置方式
Apr 25 Golang
golang中的空slice案例
Apr 27 Golang
解决Golang中ResponseWriter的一个坑
Apr 27 Golang
基于Go Int转string几种方式性能测试
Apr 28 Golang
golang 实现Location跳转方式
May 02 Golang
Goland使用Go Modules创建/管理项目的操作
May 06 Golang
Go 通过结构struct实现接口interface的问题
Oct 05 Golang
Go语言基础map用法及示例详解
Nov 17 Golang
Golang流模式之grpc的四种数据流
Apr 13 Golang
GoFrame gredis缓存DoVar Conn连接对象 自动序列化GoFrame gredisDo/DoVar方法Conn连接对象自动序列化/反序列化总结
Jun 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 中英文混合排版中处理字符串常用的函数
2007/04/12 PHP
PHP面向对象——访问修饰符介绍
2012/11/08 PHP
ThinkPHP行为扩展Behavior应用实例详解
2014/07/22 PHP
php使用curl简单抓取远程url的方法
2015/03/13 PHP
Yii CFileCache 获取不到值的原因分析
2017/02/08 PHP
PHP设计模式之 策略模式Strategy详解【对象行为型】
2020/05/01 PHP
JavaScript null和undefined区别分析
2009/10/14 Javascript
jquery随意添加移除html的实现代码
2011/06/21 Javascript
javascript 获取模态窗口的滚动位置代码
2013/08/06 Javascript
JavaScript中判断整字类型最简洁的实现方法
2014/11/08 Javascript
使用jquery动态加载js文件的方法
2014/12/24 Javascript
js控制页面的全屏展示和退出全屏显示的方法
2015/03/10 Javascript
javascript中call apply 与 bind方法详解
2016/03/10 Javascript
用NodeJS实现批量查询地理位置的经纬度接口
2016/08/16 NodeJs
Javascript数组循环遍历之forEach详解
2016/11/07 Javascript
js精确的加减乘除实例
2017/11/14 Javascript
NodeJS 中Stream 的基本使用
2018/07/30 NodeJs
element-ui中的select下拉列表设置默认值方法
2018/08/24 Javascript
微信小程序实现滑动切换自定义页码的方法分析
2018/12/29 Javascript
Vue函数式组件-你值得拥有
2019/05/09 Javascript
Vue项目打包部署到apache服务器的方法步骤
2021/02/01 Vue.js
python中assert用法实例分析
2015/04/30 Python
简单了解什么是神经网络
2017/12/23 Python
Django Form 实时从数据库中获取数据的操作方法
2019/07/25 Python
wxPython实现绘图小例子
2019/11/19 Python
深入浅析python的第三方库pandas
2020/02/13 Python
使用python实现飞机大战游戏
2020/03/23 Python
美国在线鞋类零售商:LifeStride
2019/06/09 全球购物
上课打牌的检讨书
2014/02/15 职场文书
本科应届生求职信
2014/08/05 职场文书
世界读书日的活动方案
2014/08/20 职场文书
美术教师个人总结
2015/02/06 职场文书
社区环境卫生倡议书
2015/04/29 职场文书
2019入党申请书格式和范文
2019/06/25 职场文书
详解MySQL 用户权限管理
2021/04/20 MySQL
java高级用法JNA强大的Memory和Pointer
2022/04/19 Java/Android