Go中go關鍵字的執行和main函數的退出


 1 package main
 2 
 3 import (
 4     "log"
 5 )
 6 
 7 func main() {
 8     go func() {
 9             log.Print("hello")
10     }()
11 }

你會發現這樣什么東西都么得,main函數退出,導致go關鍵字開啟的goroutine協程也關閉了。

稍微改造一下。

package main

import (
    "log"
    "time"
)

func main() {
    go func() {
            log.Print("hello")
    }()
    time.Sleep(4 * time.Second)
}

 

程序里當然不能這樣寫,要正經一點!

 

 

package main

import (
    "log"
    "os"
    "os/signal"
    "syscall"
)

func main() {
    go func() {
            log.Print("hello")
    }()
    quit := make(chan os.Signal)
    signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
    <-quit
}

 

 

 PS:

const (
// More invented values for signals
SIGHUP = Signal(0x1)
SIGINT = Signal(0x2)
SIGQUIT = Signal(0x3)
SIGILL = Signal(0x4)
SIGTRAP = Signal(0x5)
SIGABRT = Signal(0x6)
SIGBUS = Signal(0x7)
SIGFPE = Signal(0x8)
SIGKILL = Signal(0x9)
SIGSEGV = Signal(0xb)
SIGPIPE = Signal(0xd)
SIGALRM = Signal(0xe)
SIGTERM = Signal(0xf)
)
syscall.SIGINT:
程序終止(interrupt)信號, 在用戶鍵入INTR字符(通常是Ctrl-C)時發出,用於通知前台進程組終止進程。
syscall.SIGTERM:
程序結束(terminate)信號, 與SIGKILL不同的是該信號可以被阻塞和處理。通常用來要求程序自己正常退出
,shell命令kill缺省產生這個信號。如果進程終止不了,我們才會嘗試SIGKILL。
更多信號查詢:https://studygolang.com/pkgdoc


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM