登录
首页 >  Golang >  Go问答

如果另一个 goroutine 崩溃了,如何保持 goroutine 运行?

来源:stackoverflow

时间:2024-04-14 11:27:34 109浏览 收藏

欢迎各位小伙伴来到golang学习网,相聚于此都是缘哈哈哈!今天我给大家带来《如果另一个 goroutine 崩溃了,如何保持 goroutine 运行?》,这篇文章主要讲到等等知识,如果你对Golang相关的知识非常感兴趣或者正在自学,都可以关注我,我会持续更新相关文章!当然,有什么建议也欢迎在评论留言提出!一起学习!

问题内容

我一直在尝试寻找可以回答这个问题的内容,但找不到任何相关内容。

假设我在 go 中有一个类似这样的函数:

func main() {
    // assume this wrapped in a waitgroup or something 
    // so that it doesnt exit
    go queue.ConsumeAndDoSomething()
    go api.StartServer()
}

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

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


解决方案


您必须使用内置的 recover() 函数从恐慌中恢复,并且必须在 deferred 函数中调用它。

假设您有一个可能会出现恐慌的函数:

func dopanic() {
    log.println("about to panic")
    panic("test")
}

创建一个辅助函数来启动一个函数作为“受保护”的 goroutine(免受恐慌):

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 panic
2021/03/04 14:12:31 recovered: test
tick
tick
tick
...

请参阅相关问题:Generic panic recovering in go programs

如果您希望其他 goroutine 不受影响,每个 goroutine 都必须推迟 recover 调用以从潜在的恐慌中恢复。

而不是

go queue.consumeanddosomething()

你应该使用

go func(){
    defer func() {
            if r := recover(); r != nil {
                log.Error("goroutine paniqued: ", r)
            }
        }()
    queue.ConsumeAndDoSomething()
}()

好了,本文到此结束,带大家了解了《如果另一个 goroutine 崩溃了,如何保持 goroutine 运行?》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>