我有一個gen_server
正在運行,它必須在正常停止或意外崩潰時清理其狀態。清理基本上包括刪除一些文件。處理gen_server狀態的清理
此時,當gen_server
崩潰或正常停止時,清理工作在terminate/2
完成。
如果gen_server
崩潰,terminate/2
不會被調用嗎?
如果gen_server
意外死亡,是否有其他進程監視gen_server
等待清理?
因此,代碼是這樣的:
terminate(normal, State) ->
% Invoked when the process stops
% Clean up the mess
terminate(Error, State) ->
% Invoked when the process crashes
% Clean up the mess
編輯:我發現這個電子郵件在官方郵件列表,它是在談論同樣的事情:
http://groups.google.com/group/erlang-programming/browse_thread/thread/9a1ba2d974775ce8
正如Adam在下面所說的,如果我們想要避免陷入gen_server
中的存在,我們可以使用不同的方法。
但是,如果我們陷入存在,terminate/2
似乎是一個安全的地方做清理,因爲它總是會被稱爲。此外,我們必須正確處理'EXIT'
發送到terminate/2
和handle_call/3
試圖在工作人員和主管之間正確傳播錯誤。
亞當,爲什麼作爲CW發佈? – 2011-02-25 15:52:09
如果我錯了,請糾正我,但即使'gen_server'沒有陷入退出,AFAIK' terminate/2'也會被調用。當你的父母崩潰時,需要處理他們。 – Ricardo 2011-02-25 16:05:27
我運行了一些測試,'gen_server'崩潰時調用'terminate/2',所以在什麼情況下可能不會調用'terminate/2'? – Ricardo 2011-02-25 16:21:01