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」?