代码之家  ›  专栏  ›  技术社区  ›  Amitai Gottlieb

如果一个goroutine paincs,Golang为什么要终止整个过程?

  •  0
  • Amitai Gottlieb  · 技术社区  · 2 年前

    根据Go的规范:

    在执行函数F时,显式调用panic或运行时panic会终止F的执行。然后,F延迟的任何函数都会像往常一样执行。接下来,F的调用者运行的任何延迟函数都会被运行,依此类推,直到执行goroutine中的顶级函数执行的任何延迟。此时,程序终止,并报告错误情况,包括参数的值。这种终止序列被称为恐慌。

    这意味着,如果一个goroutine陷入恐慌且无法恢复,应用程序将终止。
    除了一个未处理的恐慌可能是一个容易被忽略的bug之外,这也让我的应用程序受制于导入的包,这些包可能会以未处理的恐慌启动goroutines。如果导入的包以这种方式出现恐慌,我的应用程序将终止,据我所知,无法恢复。
    在生产环境中,让我的应用程序保持活动状态是至关重要的,这种行为会带来问题。我的问题有两个:

    1. 这种设计选择背后的“哲学”理念是什么?为什么Go开发者决定省略Goroutine生命周期之间的隔离?
    2. 在另一个goroutine惊慌失措的情况下,有没有什么方法可以让goroutine保持活力?
    0 回复  |  直到 2 年前