golang--監控goroutine異常退出

在golang中,咱們能夠很輕易產生數以萬計的goroutine,不過這也帶來了麻煩:在運行中某一個goroutine異常退出,怎麼辦?golang

在erlang中,有link原語,2個進程能夠連接在一塊兒,一個在異常退出的時候,向另外一個進程呼喊崩潰的緣由,而後由另外一個進程處理這些信號,包括是否重啓這個進程。在這方面,erlang的確作得很好,估計之後這個特性會在golang中獲得實現。函數

由此獲得啓發,我寫了一個簡單的程序,監控goroutine異常退出。spa

package main import ( "log"
    "runtime"
    "math/rand"
    "time" ) type message struct { normal bool //true means exit normal, otherwise
    state map[string]interface{} //goroutine state
} func main() { runtime.GOMAXPROCS(runtime.NumCPU()) mess := make(chan message, 10) for i := 0; i < 100; i++ { go worker(mess) } supervisor(mess) } func worker(mess chan message) { defer func() { exit_message := message{state:make(map[string] interface{})} i := recover() if i != nil { exit_message.normal = false } else { exit_message.normal = true } mess <- exit_message }() now := time.Now() seed := now.UnixNano() rand.Seed(seed) num := rand.Int63() if num % 2 != 0 { panic("not evening") } else { runtime.Goexit() } } func supervisor(mess chan message) { for i := 0; i < 100; i++ { m := <- mess switch m.normal { case true : log.Println("exit normal, nothing serious!") case false: log.Println("exit abnormal, something went wrong") } } }

本來是想把goroutine異常退出時的狀態,也就是某些變量保存到message中的state,而後在另外一個goroutine裏面處理這些數據,不過能力有限,暫時作不出來,之後會完善的。這裏只驗證goroutine在異常退出的時候,向另外一個goroutine發送信號。code

在worker函數裏面,會判斷隨機數是否是偶數,不是的話會使用panic異常退出,而後使用defer向supervisor發送信號,supervisor接受到就輸出結果。orm

下面看一下效果:blog

咱們用了100個goroutine,也就有100個退出信號。由圖能夠獲得咱們的程序運行良好。進程

轉貼請註明來自:格通get

相關文章
相關標籤/搜索