Go語(yǔ)言 go程釋放操作(退出/銷毀)
情況1:
Go語(yǔ)言中,若在子go程中創(chuàng)建一個(gè)新 go程,子go程釋放(銷毀),新創(chuàng)建的go程不會(huì)隨著子go程的銷毀而銷毀。
原因:
go程共享堆,不共享?xiàng)?,go程由程序員在go的代碼里顯示調(diào)度(釋放)。
實(shí)例:
package main
import (
"fmt"
"time"
"runtime"
)
func test() {
for i:=0;i<10;i++{
fmt.Printf("執(zhí)行第%d次go程\n",i)
time.Sleep(time.Second)
}
fmt.Println("go程執(zhí)行完畢!")
}
func main() {
go func() {
go test()
fmt.Println("------aaaaaaaa-------")
time.Sleep(time.Second)
fmt.Println("------go程結(jié)束--------------")
/*
不管是return 還是 runtime.Goexit(),效果一樣
*/
//return
runtime.Goexit()
}()
for{
runtime.GC()
}
}

從以上實(shí)例來看,雖然子go程已經(jīng)退出,但是在子go程中新建的go程還在執(zhí)行!原因:go程不共享?xiàng)?,有自己?dú)立的??臻g。子go程有自己的棧,在子go程中創(chuàng)建的新go程也有自己的棧。
子go程的棧被釋放(回收),由于棧獨(dú)立,因此新創(chuàng)建的go程的棧不會(huì)被釋放。
情況2:
Go語(yǔ)言中,若在主go程中創(chuàng)建一個(gè)新 go程,主go程釋放(銷毀),新創(chuàng)建的go程隨著主go程的銷毀而銷毀。
原因:
go程共享堆,不共享?xiàng)?,go程由程序員在go的代碼里顯示調(diào)度(釋放)。
實(shí)例:
package main
import (
"fmt"
"time"
)
func main() {
go func() {
for i:=0;i<10;i++{
fmt.Printf("子go程:執(zhí)行第%d次操作!\n",i)
time.Sleep(time.Second)
}
}()
for i:=0;i<3;i++{
fmt.Println("--------aaaa------")
time.Sleep(time.Second)
}
}

從以上實(shí)例來看,雖然主go程退出,子go程馬上退出。原因:go程共享堆。主go程和新創(chuàng)建的子go程共享一個(gè)堆。主go程退出,執(zhí)行main對(duì)應(yīng)的{ },堆退出。由于是共享堆,所以對(duì)應(yīng)的子go程也會(huì)被銷毀。
補(bǔ)充:go基礎(chǔ)之服務(wù)退出問題
最近學(xué)習(xí)公司微服務(wù)的代碼,看到每一個(gè)微服務(wù)的main函數(shù)都阻塞在那里,然后里面起的goroutine一直在哪里運(yùn)行。
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) //初始化一個(gè)channel
signal.Notify(exit, syscall.SIGINT, syscall.SIGTERM) //notify方法用來監(jiān)聽收到的信號(hào)
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函數(shù)的運(yùn)行。然后goroutine隨之停止運(yùn)行。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
golang 歸并排序,快速排序,堆排序的實(shí)現(xiàn)
本文主要介紹了golang 歸并排序,快速排序,堆排序的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01
Golang中自定義json序列化時(shí)間格式的示例代碼
Go語(yǔ)言作為一個(gè)由Google開發(fā),號(hào)稱互聯(lián)網(wǎng)的C語(yǔ)言的語(yǔ)言,自然也對(duì)JSON格式支持很好,下面這篇文章主要介紹了關(guān)于Golang中自定義json序列化時(shí)間格式的相關(guān)內(nèi)容,下面話不多說了,來一起看看詳細(xì)的介紹吧2024-08-08
Ubuntu安裝Go語(yǔ)言運(yùn)行環(huán)境
由于最近偏愛Ubuntu,在加上作為一門開源語(yǔ)言,在Linux上從源代碼開始搭建環(huán)境更讓人覺得有趣味性。讓我們直接先從Go語(yǔ)言的環(huán)境搭建開始2015-04-04
go簡(jiǎn)介及國(guó)內(nèi)鏡像源配置全過程
本文介紹了Go語(yǔ)言的基本概念和環(huán)境配置,包括GOROOT、GOPATH和GOMODULE的設(shè)置,還展示了如何在IDEA中配置Go語(yǔ)言的開發(fā)環(huán)境,并通過一個(gè)簡(jiǎn)單的“HelloWorld”項(xiàng)目來熟悉Go語(yǔ)言的基本語(yǔ)法和開發(fā)流程2025-01-01

