【发布时间】:2021-03-04 12:56:57
【问题描述】:
我一直在努力寻找可以回答这个问题的东西,但我找不到任何关于它的东西。
假设我在 Go 中有一个类似这样的函数:
func main() {
// assume this wrapped in a waitgroup or something
// so that it doesnt exit
go queue.ConsumeAndDoSomething()
go api.StartServer()
}
我这里有两个 goroutines 做完全不同的事情,理想情况下一个应该在另一个崩溃/恐慌时继续运行。如果队列操作失败,API 服务器应该会受到影响,反之亦然。
我不确定这是否可能(甚至推荐)。是否有一种干净的方法来执行此操作,或者一旦 goroutine 发生恐慌,整个程序是否应该退出?
【问题讨论】:
-
我刚刚在其中一个 goroutine 中尝试了
panic并且整个程序退出了 -
使用
recover从恐慌中恢复。 -
虽然值得注意的是
panic的目的是让应用程序崩溃;适合recover的情况实际上相当少见(例如,net/http的服务器将在处理程序发生恐慌时恢复,因此一个处理程序不会使整个服务器崩溃)并且通常表明panic不应该一开始就在那里,它应该只是一个错误。
标签: go concurrency goroutine