hb_sz 发表于 2018-9-20 08:20:05

golang--监控goroutine异常退出

  在golang中,我们可以很轻易产生数以万计的goroutine,不过这也带来了麻烦:在运行中某一个goroutine异常退出,怎么办?
  在erlang中,有link原语,2个进程可以链接在一起,一个在异常退出的时候,向另一个进程呼喊崩溃的原因,然后由另一个进程处理这些信号,包括是否重启这个进程。在这方面,erlang的确做得很好,估计以后这个特性会在golang中得到实现。
  由此得到启发,我写了一个简单的程序,监控goroutine异常退出。
  

package main  

  
import (
  

"log"  
"runtime"
  
"math/rand"
  
"time"
  
)
  

  
type message struct {
  
normal bool //true means exit normal, otherwise
  
state mapinterface{} //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 interface{})}
  
i := recover()
  
if i != nil {
  
exit_message.normal = false
  
} else {
  
exit_message.normal = true
  
}
  
mess
页: [1]
查看完整版本: golang--监控goroutine异常退出