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 空map和未初始化map的注意事项说明
Apr 29 Golang
使用Golang的channel交叉打印两个数组的操作
Apr 29 Golang
完美解决golang go get私有仓库的问题
May 05 Golang
go语言基础 seek光标位置os包的使用
May 09 Golang
Golang 语言控制并发 Goroutine的方法
Jun 30 Golang
详解Go语言Slice作为函数参数的使用
Jul 02 Golang
Go语言基础知识点介绍
Jul 04 Golang
深入理解go slice结构
Sep 15 Golang
Go语言基础map用法及示例详解
Nov 17 Golang
Golang 并发编程 SingleFlight模式
Apr 26 Golang
深入理解 Golang 的字符串
May 04 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正则表达式(regar expression)
2011/09/10 PHP
php一个找二层目录的小东东
2012/08/02 PHP
PHP中使用crypt()实现用户身份验证的代码
2012/09/05 PHP
php 输出json及显示json中的中文汉字详解及实例
2016/11/09 PHP
JQuery 国际象棋棋盘 实现代码
2009/06/26 Javascript
理解JSON:3分钟课程
2011/10/28 Javascript
从jquery的过滤器.filter()方法想到的
2013/09/29 Javascript
js判断undefined类型示例代码
2014/02/10 Javascript
js 本地预览的简单实现方法
2014/02/18 Javascript
JavaScript 事件对象介绍
2015/04/13 Javascript
JavaScript实现横向滑出的多级菜单效果
2015/10/09 Javascript
Nodejs 获取时间加手机标识的32位标识实现代码
2017/03/07 NodeJs
JS实现新建文件夹功能
2017/06/17 Javascript
详解关于react-redux中的connect用法介绍及原理解析
2017/09/11 Javascript
vue父子组件的通信方法(实例详解)
2019/11/10 Javascript
用vite搭建vue3应用的实现方法
2021/02/22 Vue.js
python中urllib模块用法实例详解
2014/11/19 Python
Python使用openpyxl读写excel文件的方法
2017/06/30 Python
Python中用字符串调用函数或方法示例代码
2017/08/04 Python
python感知机实现代码
2019/01/18 Python
详解python3中用HTMLTestRunner.py报ImportError: No module named 'StringIO'如何解决
2019/08/27 Python
详解Python中的分支和循环结构
2020/02/11 Python
Django 自定义权限管理系统详解(通过中间件认证)
2020/03/11 Python
关于python中remove的一些坑小结
2021/01/04 Python
python工具快速为音视频自动生成字幕(使用说明)
2021/01/27 Python
用HTML5 Canvas API中的clearRect()方法实现橡皮擦功能
2016/03/15 HTML / CSS
浅谈HTML5 服务器推送事件(Server-sent Events)
2017/08/01 HTML / CSS
Avène雅漾美国官方网站:敏感肌肤护理专家
2016/10/24 全球购物
人力资源管理专业应届生求职信
2013/09/28 职场文书
总经理司机职责
2014/02/02 职场文书
大学活动总结格式
2014/04/29 职场文书
演讲稿的写法
2014/05/19 职场文书
小学学校评估方案
2014/06/08 职场文书
公共场所标语
2014/06/30 职场文书
教师个人考察材料
2014/12/16 职场文书
四十九个javascript小知识实用技巧
2021/11/20 Javascript