返回顶部
首页 > 资讯 > 后端开发 > GO >Go语言 go程释放操作(退出/销毁)
  • 430
分享到

Go语言 go程释放操作(退出/销毁)

GOgo语言 2022-06-07 20:06:46 430人浏览 泡泡鱼
摘要

情况1: Go语言中,若在子go程中创建一个新 go程,子go程释放(销毁),新创建的go程不会随着子go程的销毁而销毁。 原因: go程共享堆,不共享栈,go程由程序员在go

情况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()
}()
for{
runtime.GC()
}
}

从以上实例来看,虽然子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程退出,执行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随之停止运行。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。如有错误或未考虑完全的地方,望不吝赐教。


您可能感兴趣的文档:

--结束END--

本文标题: Go语言 go程释放操作(退出/销毁)

本文链接: https://lsjlt.com/news/30614.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Go语言 go程释放操作(退出/销毁)
    情况1: Go语言中,若在子go程中创建一个新 go程,子go程释放(销毁),新创建的go程不会随着子go程的销毁而销毁。 原因: go程共享堆,不共享栈,go程由程序员在go...
    99+
    2022-06-07
    GO go语言
  • Go语言中go程释放操作的示例分析
    小编给大家分享一下Go语言中go程释放操作的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!go适合做什么go是golang的简称,而golang可以做服务...
    99+
    2023-06-14
  • Go语言注释的作用是什么
    本篇内容主要讲解“Go语言注释的作用是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Go语言注释的作用是什么”吧!注释在程序中的作用是对程序进行注解和说明,高程序代码的可读性,便于对源码的阅...
    99+
    2023-07-05
  • go语言操作es的方法
    这篇文章主要介绍“go语言操作es的方法”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“go语言操作es的方法”文章能帮助大家解决问题。Elasticsearch介绍Elasticsearch(ES)...
    99+
    2023-06-30
  • go语言中json数据的读取和写出操作
    go自带json库,在使用时需要通过 import "encoding/json"来导入该库。 在读取和写入json数据之前需要定义相关的结构体来对应被操作的json数据的格式...
    99+
    2022-06-07
    json数据 JSON GO go语言
  • go语言用什么操作系统
    Go语言支持包括FreeBSD、Linux、Solaris和Windows等的多种操作系统。Go语言是跨平台、跨操作系统的语言。由于其模块化设计和模块化,即代码被编译并转换为尽可能小的二进制形式,因此,Go语言不需要依赖性;它的代码可以在任...
    99+
    2023-05-14
    go语言
  • GO语言操作Elasticsearch示例分享
    目录Elasticsearch简介连接Elasticsearch创建索引创建model结构体初始化model创建索引搜索数据创建返回结构体搜索数据解析数据修改数据单条修改批量修改删除...
    99+
    2023-01-17
    golang操作Elasticsearch Go言操作ElasticSearch go操作elasticsearch示例
  • Go语言命令行操作指南
    《Go语言命令行操作指南》 随着Go语言在开发领域的广泛应用,越来越多的开发者开始使用Go来编写命令行工具。Go语言强大的标准库和简洁的语法使其成为一种非常适合用于命令行操作的编程语言...
    99+
    2024-04-02
  • Go语言IO操作输入输出底层原理及文件操作API
    目录1.输入输出的底层原理2. 文件操作相关API3. 打开和关闭文件4. 写文件5. 读文件6. 拷贝文件7. bufio1.输入输出的底层原理 终端其实是一个文件,相关实例如下...
    99+
    2023-01-08
    Go IO操作输入输出API Go IO API
  • Go与C语言的互操作实现
    目录一、Go调用C代码的原理二、在Go中使用C语言的类型1、原生类型数值类型指针类型字符串类型数组类型2、自定义类型枚举(enum)结构体(struct)联合体(unio...
    99+
    2022-06-07
    GO 互操作 C语言
  • Go语言操作MySQL的知识总结
    目录一、连接1.1 下载依赖1.2 使用mysql驱动1.3 初始化连接1.4 SetMaxOpenConns1.5 SetMaxIdleConns二、CRUD2.1 建库建表2.2 查询2.3 单行查询2.4 多行查询...
    99+
    2024-04-02
  • go语言操作es的实现示例
    目录Elasticsearch介绍Elasticsearch能做什么go语言操作es解决golang使用elastic连接elasticsearch时自动转换连接地址初始化数据创建查...
    99+
    2024-04-02
  • Go语言zip文件的读写操作
    目录创建 zip 归档文件读取 zip 归档文件Go语言的标准库提供了对几种压缩格式的支持,其中包括 gzip,因此 Go 程序可以无缝地读写 .gz 扩展名的 gzip 压缩文件或...
    99+
    2023-05-14
    Go语言zip读写 go读写ZIP文件
  • 用Go语言实现操作符重载
    利用Go语言实现运算符重载的方法 在Go语言中,是不支持像C++或者Python那样直接重载运算符的。但是我们可以通过定义自定义类型和对应的方法来模拟实现运算符重载的功能。下面将介绍如...
    99+
    2024-02-24
    方法 go语言 运算符重载
  • Go语言支持哪些操作系统?
    Go语言是一种跨平台的编程语言,因此它支持多种不同的操作系统。在Go语言中,通过标准库和第三方库的支持,可以很方便地跨平台开发应用程序。下面将介绍Go语言支持的一些常见操作系统,并给出...
    99+
    2024-03-02
    linux windows macos go语言 linux操作系统 标准库
  • Go语言中的I/O操作详解
    Go语言是一种由Google开发的开源编程语言,其设计注重简洁、高效和并发性能。在Go语言中,I/O操作是非常常见且重要的一部分,本文将详细介绍Go语言中的I/O操作,包括文件读写、网...
    99+
    2024-04-02
  • Go语言文件操作最佳实践
    go语言文件操作最佳实践:使用 os.open/os.openfile 打开文件并自动关闭(defer file.close());使用 ioutil.readall 读取整个文件或 b...
    99+
    2024-04-08
    go 文件操作 go语言
  • go语言内存申请和释放的方法是什么
    在Go语言中,内存的申请和释放是由Go的垃圾回收器自动管理的,开发者不需要手动申请和释放内存。Go语言使用了自动垃圾回收(Garba...
    99+
    2023-10-20
    go语言
  • Go 程序在 goroutine 工作完成之前退出
    php小编小新在这篇文章中将介绍一个关于Go程序的重要问题:在goroutine工作完成之前退出的情况。在Go语言中,goroutine是一种轻量级的线程,可以并发执行任务。然而,当我...
    99+
    2024-02-08
    go语言
  • 文件操作必备:Go语言异步编程实践
    Go语言是近年来备受推崇的一门编程语言,其出色的并发性能和简洁的语法使得它在网络编程、云计算等领域有着广泛的应用。而文件操作是我们在日常开发中必不可少的一部分,为了更好的利用Go语言的并发特性,我们可以使用异步编程来进行文件操作。本文将介...
    99+
    2023-09-24
    异步编程 文件 关键字
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作