Erlang替代trap_exit?

时间:2014-10-10 18:21:52

标签: process erlang exit supervisor gen-server

我想在gen_server停止时执行一些代码。我有我的gen_server陷阱退出(我将process_flag(trap_exit, true)添加到init回调中)。这很有效,因为在进程退出之前始终会调用terminate/2。我知道,因为我正在捕获退出链接进程,崩溃不会导致我创建的gen_server崩溃。我可以解决这个问题,但我想知道是否有替代方法可以使用process_flag(trap_exit, true)来实现这一目标?

我只想要一个“在进程退出之前”回调。还有其他类似的退出吗?

2 个答案:

答案 0 :(得分:3)

Fron doc:

  

当trap_exit设置为true时,到达进程的退出信号为   转换为{'EXIT',From,Reason}消息,可以作为   普通的消息。如果trap_exit设置为false,则进程退出if   它接收正常以外的退出信号,退出信号为   传播到其链接的进程。申请流程应该   通常不会陷阱退出。

这意味着如果trap_exit标志设置为true的进程将在其任何链接进程异常死亡时退出。它必须有一个带有子句的接收块,以捕获{'EXIT', From, Reason}形式的任何消息。在本接收条款中,您可以在最终停止流程之前执行所需操作。

在gen_server中,您必须编写回调Module:handle_info({'EXIT', From, Reason}, State) -> Result

答案 1 :(得分:1)

@Pascal的答案是完全正确的,但我想提出另一种方法。

有时您希望通过gen_server生成流程,但通常,您可以将它们放在监督层次结构中,这样更安全。您可以使用gen_server 重启策略让同一主管生成这些流程并one_for_all。如果其中一个进程死掉,它们都会重新启动。其次,你必须为 shutdown strategy 指定超时 - 这将确保将调用terminate函数。