防止goroutine崩溃同时也导致主进程崩溃

举个例子 比如这种情况 主进程会直接崩溃 看不到这个ok的打印

package main

import (
    "log"
    "time"
)

func Panic()  {
    panic(1)
}

func main()  {
    go Panic()
    time.Sleep(1 * time.Second)
    log.Println("OK")
}

 

这时使用这个函数

在panic之后主进程就不会崩溃了

可以看到这个ok打印出来

func NewRoutine(f func()) {
	go func() {
		defer func() {
			// Recover from panic.
			if err := recover(); err != nil {
				stack := string(debug.Stack())
				log.Println(err)
				log.Println(stack)
			}
		}()

		f()
	}()
}
func Panic()  {
    panic(1)
}
func main()  {
    NewRoutine(Panic)

    time.Sleep(1 * time.Second)
    log.Println("OK")
}

  

 

因为这个函数里使用了recover 可以使panic的函数不会立刻返回 而是先defer 再返回

这样就避免了主进程崩溃的情况

posted @ 2019-12-13 09:46  良将ℓ  阅读(640)  评论(0编辑  收藏  举报