我有一个gen_server
运行,它必须在正常停止或意外崩溃时清理其状态。清理基本上包括删除一些文件。
此时,当gen_server
崩溃或正常停止时,清理完成terminate/2
。
如果崩溃,有什么理由terminate/2
不会被调用?gen_server
如果意外死亡,是否应该有任何其他进程监视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
正如亚当在下面所说,如果我们想避免将存在困在 中gen_server
,我们可以使用不同的方法。
但是如果我们捕获存在,terminate/2
似乎是一个安全的地方进行清理,因为它总是会被调用。此外,我们必须正确处理何时'EXIT'
发送到terminate/2
并handle_call/3
尝试在工人和主管之间正确传播错误。