Go语言 go程释放操作(退出/销毁)
来源:脚本之家
时间:2022-12-29 17:13:59 286浏览 收藏
本篇文章主要是结合我之前面试的各种经历和实战开发中遇到的问题解决经验整理的,希望这篇《Go语言 go程释放操作(退出/销毁)》对你有很大帮助!欢迎收藏,分享给更多的需要的朋友学习~
情况1:
Go语言中,若在子go程中创建一个新 go程,子go程释放(销毁),新创建的go程不会随着子go程的销毁而销毁。
原因:
go程共享堆,不共享栈,go程由程序员在go的代码里显示调度(释放)。
实例:
package main
import (
"fmt"
"time"
"runtime"
)
func test() {
for i:=0;i
<p style="text-align: center"><img class="has" alt="" style="max-width:100%" style="max-width:100%" style="font-size: medium; font-family: " microsoft yahei white-space: normal word-spacing: text-transform: none font-weight: color: rgb font-style: orphans: widows: letter-spacing: text-indent: font-variant-ligatures: font-variant-caps: text-decoration-style: initial text-decoration-color: src="/uploads/20221229/167230620263ad5e1aebec6.png"></p>
<p>从以上实例来看,虽然子go程已经退出,但是在子go程中新建的go程还在执行!原因:go程不共享栈,有自己独立的栈空间。子go程有自己的栈,在子go程中创建的新go程也有自己的栈。</p>
<p>子go程的栈被释放(回收),由于栈独立,因此新创建的go程的栈不会被释放。</p>
<h2>情况2:</h2>
<p>Go语言中,若在主go程中创建一个新 go程,主go程释放(销毁),新创建的go程随着主go程的销毁而销毁。</p>
<h2>原因:</h2>
<p>go程共享堆,不共享栈,go程由程序员在go的代码里显示调度(释放)。</p>
<h2>实例:</h2>
<pre class="brush:plain;">
package main
import (
"fmt"
"time"
)
func main() {
go func() {
for i:=0;i
<p style="text-align: center"><img class="has" alt="" style="max-width:100%" style="max-width:100%" style="font-size: medium; font-family: " microsoft yahei white-space: normal word-spacing: text-transform: none font-weight: color: rgb font-style: orphans: widows: letter-spacing: text-indent: font-variant-ligatures: font-variant-caps: text-decoration-style: initial text-decoration-color: src="/uploads/20221229/167230620363ad5e1b23e94.png"></p>
<p>从以上实例来看,虽然主go程退出,子go程马上退出。原因:go程共享堆。主go程和新创建的子go程共享一个堆。主go程退出,执行main对应的{ },堆退出。由于是共享堆,所以对应的子go程也会被销毁。</p>
<p><strong>补充:go基础之服务退出问题</strong></p>
<p>最近学习公司微服务的代码,看到每一个微服务的main函数都阻塞在那里,然后里面起的goroutine一直在哪里运行。</p>
<pre class="brush:plain;">
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 :=
<p>代码输出</p>
<blockquote>
<p>[root@localhost demoproject]# go run test.go</p>
<p>testing....</p>
<p>^C[TestGoroutine]2018/07/31 19:26:14 test.go:36: interrupt</p>
<p>i am exiting!</p>
</blockquote>
<p>可以看到知道按了ctrl+c之后才退出main函数的运行。然后goroutine随之停止运行。</p>
<p>以上为个人经验,希望能给大家一个参考,也希望大家多多支持golang学习网。如有错误或未考虑完全的地方,望不吝赐教。</p><p>以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。</p>
声明:本文转载于:脚本之家 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
-
342 收藏
-
161 收藏
-
337 收藏
-
163 收藏
-
210 收藏
最新阅读
更多>
-
299 收藏
-
455 收藏
-
104 收藏
-
441 收藏
-
224 收藏
-
104 收藏
-
128 收藏
-
442 收藏
-
194 收藏
-
470 收藏
-
163 收藏
-
404 收藏
课程推荐
更多>
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习