【发布时间】:2011-07-04 09:30:54
【问题描述】:
我有一个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 试图在工人和主管之间正确传播错误时,我们必须正确处理。
【问题讨论】:
标签: erlang erlang-otp