我有一个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