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

点点圈 提交于 2019-12-13 10:35:58

举个例子 比如这种情况 主进程会直接崩溃 看不到这个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 再返回

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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!