您如何从“并发映射读取和映射写入”的运行时恐慌中恢复?使用恢复的通常延迟似乎不起作用。这是为什么?
我知道您不应该在并发上下文中使用地图,但仍然:如何在这里恢复?
例子:
package main
import "time"
var m = make(map[string]string)
func main() {
go func() {
for {
m["x"] = "foo"
}
}()
go func() {
for {
m["x"] = "foo"
}
}()
time.Sleep(1 * time.Second)
}
请添加恢复代码。:)
恢复在这里不起作用,因为您所经历的不是恐慌状态。
Go 1.6 向运行时添加了轻量级并发滥用地图检测:
运行时添加了轻量级、尽力而为的并发滥用地图检测。与往常一样,如果一个 goroutine 正在写入 map,则其他 goroutine 不应该同时读取或写入 map。 如果运行时检测到这种情况,它会打印诊断信息并使程序崩溃。 了解更多问题的最佳方法是在[比赛检测器](https://blog.golang.org/race- detector)下运行程序,这将更可靠地识别比赛并提供更多细节。
您遇到的是运行时 故意崩溃 ,这不是延迟函数中的调用可能停止panic()
的调用的结果。recover()
除了防止同时滥用地图之外,您无能为力。如果您让您的应用程序保持这样并且它不会崩溃,那么您可能会在运行时遇到神秘的、未定义的行为。