濮阳杆衣贸易有限公司

主頁 > 知識(shí)庫 > Go語言 go程釋放操作(退出/銷毀)

Go語言 go程釋放操作(退出/銷毀)

熱門標(biāo)簽:外呼系統(tǒng)顯本地手機(jī)號(hào) 壽光微信地圖標(biāo)注 阿克蘇地圖標(biāo)注 excel地圖標(biāo)注分布數(shù)據(jù) 評(píng)價(jià)高的400電話辦理 電話機(jī)器人軟件免費(fèi) 百度地圖標(biāo)注后傳給手機(jī) 外呼系統(tǒng)用什么卡 涿州代理外呼系統(tǒng)

情況1:

Go語言中,若在子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;i10;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語言中,若在主go程中創(chuàng)建一個(gè)新 go程,主go程釋放(銷毀),新創(chuàng)建的go程隨著主go程的銷毀而銷毀。

原因:

go程共享堆,不共享?xiàng)#琯o程由程序員在go的代碼里顯示調(diào)度(釋放)。

實(shí)例:

package main
 
import (
	"fmt"
	"time"
)
func main() {
	go func() {
		for i:=0;i10;i++{
			fmt.Printf("子go程:執(zhí)行第%d次操作!\n",i)
			time.Sleep(time.Second)
		}
	}()
	for i:=0;i3;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ò)誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:
  • golang 阻止主goroutine退出的操作
  • Golang實(shí)現(xiàn)超時(shí)退出的三種方式
  • Golang信號(hào)處理及如何實(shí)現(xiàn)進(jìn)程的優(yōu)雅退出詳解
  • Golang實(shí)現(xiàn)for循環(huán)運(yùn)行超時(shí)后自動(dòng)退出的方法
  • 解決go在函數(shù)退出后子協(xié)程的退出問題

標(biāo)簽:欽州 雞西 蘭州 梅河口 吐魯番 汕頭 銅川 重慶

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Go語言 go程釋放操作(退出/銷毀)》,本文關(guān)鍵詞  語言,程釋放,程,釋放,操作,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Go語言 go程釋放操作(退出/銷毀)》相關(guān)的同類信息!
  • 本頁收集關(guān)于Go語言 go程釋放操作(退出/銷毀)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    铁力市| 吉林省| 洞口县| 哈尔滨市| 宜昌市| 松桃| 新巴尔虎右旗| 通化县| 阳曲县| 开原市| 赣榆县| 福泉市| 泗阳县| 广安市| 新建县| 禄劝| 德安县| 丰镇市| 沙坪坝区| 古丈县| 玛沁县| 运城市| 武隆县| 历史| 丹东市| 兰溪市| 连平县| 汝南县| 德安县| 南平市| 阜南县| 南阳市| 浦东新区| 甘南县| 乌什县| 咸丰县| 达拉特旗| 正宁县| 治县。| 县级市| 靖边县|