標籤:

Golang 里的fatal error怎麼處理?

開發項目由於map沒有家讀寫鎖,發生報錯

fatal error:concurrent map read and map write

該報錯似乎沒法被recover捕獲到,同樣的 fatal error: all goroutines are asleep - deadlock!也無法捕獲

問一下除了在編寫代碼時注意此類問題,還有什麼辦法可以更好的處理這類fatal error的問題。

誰知道這個fatal error詳情的最好能詳細解釋一下


fatal 了還想怎麼處理?當沒事發生過,繼續往下跑?以後炸了你都不知道怎麼死的!

這兩種情況都說明你的代碼有嚴重、致命的問題,處理方法就是修正代碼,別無他途。

我可以理解你為什麼想這樣做。有問題掩蓋住,僥倖怪不到自己頭上是吧?

不用處理,讓它掛掉。


fatal error 正確的處理方式就是——趕緊改代碼

如果你的系統真的很重要,一刻也不能停下,那處理方式就是——徹底重啟,同時用連環 call 把你喊來趕緊改代碼


瀉藥。

recover都抓不到,那還能怎麼辦,讓他掛掉,然後改程序啊


並發編程的關鍵之處在於規劃並發在何時何地進行,避免共享變數的並發訪問。

而鎖操作的意義只是簡單的抓住了臨界資源,而沒有解決資源讀寫發生的順序關係。因此不論map有沒有鎖,都應該審視自己的代碼有沒有良好的任務規劃。

Programs that modify data being simultaneously accessed by multiple goroutines must serialize such access.

http://golang.org/ref/mem


多謝各位大神回答,其實還有兩個問題:

1,我們用的框架是宣稱可以隔離panic的,所以理論上一些小問題可以由框架規避。如果說fatal error不能被捕獲,能否請碰到過fatal error的朋友闡述一下golang比較容易遇到的產生fatal error,死鎖和競態除外。

2,能否詳述一下fatal error產生的機制,或者有沒有相關代碼?


推薦閱讀:

golang里gc相關的write barrier(寫屏障)是個什麼樣的過程或者概念?
為什麼go語言gc的時候要暫停整個程序?
如何評價 Go for android 或 Swift for web 這種現象?
為啥 Erlang 沒有像 Go、Scala 語言那樣崛起?
如何看待「Go 2.0」?

TAG:Go語言 | Go編程 |