Golang--runtime.Goexit() 和 panic
Golang--runtime.Goexit() 和 panic
《Go101》:
恐慌和Goexit信号是互不干扰的。 换句话说,一个尚未被恢复的恐慌不会导 致一个Goexit信号被取消;一个Goexit信号也不会压制遮挡一个尚未被恢复的恐慌。
但是目前Go 1.16.5版本中,确实以下状态:
package main
import "runtime"
func f(){
defer runtime.Goexit()
panic(1)
}
func main() {
go f()
}
上述例子将会被安全退出。
相关issue也在2019年被人提出,还在讨论内。
https://github.com/golang/go/issues/35378
下面的例子在Go 1.14之前将会是永不退出的状态。
package main
import "runtime"
func f() {
go func(){
defer func(){
recover()
}()
defer panic(1)
runtime.Goexit()
}()
}
func main(){
f()
runtime.Gosched()
}
在Go 1.14之后的编译器修复了相关问题。
https://github.com/golang/go/issues/29226
以上参考自《Go 101》
以后修复的方向围绕着,怎么处理好runtime.Goexit()和panic之间的关系。
两者之间的优先级首先得到确认,如果runtime.Goexit()不能在最高优先级,那么就很难再配得上runtime和Goexit这两个命名,但是panic被压制,将会掩盖掉业务逻辑上的瑕疵,这是一个引发生产事故的隐患。
TomatoSCI提供专业的科研数据分析服务,现有包括 pca 主成分分析 rda 冗余分析 pcoa 主坐标分析 lasso 套索回归 mantel test 曼特尔检验 层次聚类 (Hierarchical Clustering)等等统计分析服务、数据可视化、实验数据处理。我们帮助研究人员高效处理SCI论文、硕博论文的数据分析需求,提供全面的R语言和Python数据分析解决方案。SPSS最实惠最低价的替代品!

浙公网安备 33010602011771号