如果另一个发生崩溃,你如何保持戈鲁丁的运行?

我一直试图找到一些可以回答这个问题的东西,但我找不到任何谈论它的东西。


假设我在Go中有一个函数,它是这样的:


func main() {

    // assume this wrapped in a waitgroup or something 

    // so that it doesnt exit

    go queue.ConsumeAndDoSomething()

    go api.StartServer()

}

我这里有两个goroutine,它们做完全不同的事情,如果另一个崩溃/恐慌,理想情况下应该继续运行。如果队列操作失败,API 服务器应该会受到影响,反之亦然。


我不确定这是否可能(甚至推荐)。有没有一种干净的方法可以做到这一点,或者一旦goroutine恐慌,整个程序是否应该退出?


PIPIONE
浏览 97回答 2
2回答

偶然的你

您必须使用内置的 recover() 函数从 panic 中恢复,并且必须在延迟函数中调用它。假设您有一个可能会惊慌失措的函数:func doPanic() {    log.Println("about to panic")    panic("test")}创建一个帮助程序函数,以启动一个函数作为 goroutine “protected”(来自 panics):func protect(f func()) {    defer func() {        if err := recover(); err != nil {            log.Printf("Recovered: %v", err)        }    }()    f()}并像这样使用它:func main() {    go protect(doPanic)    for {        time.Sleep(time.Second)        fmt.Println("tick")    }}此测试应用将输出:2021/03/04 14:12:31 about to panic2021/03/04 14:12:31 Recovered: testtickticktick...

青春有我

如果您希望其他goroutine不受影响,则每个goroutine必须推迟呼叫以从潜在的恐慌中恢复过来。recover而不是go queue.ConsumeAndDoSomething()您应该使用go func(){    defer func() {            if r := recover(); r != nil {                log.Error("goroutine paniqued: ", r)            }        }()    queue.ConsumeAndDoSomething()}() 
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go