请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

无法启动过多协程

老师,您好。我是用Go 1.20的试验启动100万的协程发生了panic。
是因为Go版本更新后添加了限制还是和PC环境有关?

 too many concurrent operations on a single file or socket (max 1048575)


我自己试着写了recover的代码(当然是在协程内部写的),发现无法捕获这panic。
查了一下资料,Go里有一些无法被恢复的panic。
https://stackoverflow.com/questions/57486620/are-all-runtime-errors-recoverable-in-go

这种panic是否属于无法恢复的? 实践中碰到这种问题一般如何解决?这种runtime的panic如果光靠codereview感觉很难发现。

正在回答 回答被采纳积分+3

1回答

bobby 2023-11-26 10:52:57

在 Go 中,无法被 recover 恢复的 panic 通常是由一些严重的运行时错误引起的,这些错误表明程序可能处于不可恢复的状态。在这种情况下,Go 的设计哲学是让程序崩溃并停止执行,以防止可能的数据损坏或不一致性。

如果你想要在出现 panic 时不让程序关闭退出,可以使用 os.Exit 来捕获 panic 并执行一些最后的清理工作,然后正常退出程序。请注意,这只是一种应急手段,因为在执行 os.Exit 后,任何 defer 延迟函数都不会执行。

以下是一个简单的例子:

https://img1.sycdn.imooc.com/szimg/6562b2eb0951e9ba06990617.jpg


0 回复 有任何疑惑可以回复我~
  • 提问者 慕妹3255656 #1
    sample code是可行的。但试了一下,系统崩溃级别的panic还是无法recover。
    能发生系统崩溃级别的panic输入代码的bug,好像只能通过经验来避免这种错误代码。
    
    Go的实现是内部把这种fatal panic提前recover,强制终止程序并打印错误信息。
    回复 有任何疑惑可以回复我~ 2023-11-28 09:52:54
  • bobby 回复 提问者 慕妹3255656 #2
    是的,这种情况发生后就在运维的角度去监控服务 让这个服务重启就行了
    回复 有任何疑惑可以回复我~ 2023-11-28 22:57:32
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信