2014-10-10 57 views
0

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

我只想要一个“在进程退出”回调之前。还有其他的东西像这样退出吗?

+0

你想链接的进程杀死'gen_server',但是你也想'terminate'(或类似的)在退出时被调用吗? – 2014-10-10 18:26:12

+0

没错。这是我的理解,如果我陷入退出没有其他进程可以导致我的gen_server崩溃,如果出现问题,它真的应该。 – Stratus3D 2014-10-10 18:54:43

+0

我很确定陷阱退出只是导致它运行终止,然后退出。它实际上是否阻止gen_server停止? – kjw0188 2014-10-10 21:10:29

回答

1

@帕斯卡尔的回答是完全正确的,但我想提出另一个问题。

有时候你想通过gen_server产生进程,但通常你可以把它们放在监督层次结构中,这样更安全。您可以通过one_for_all重启策略产生由同一个主管产生的这些进程和gen_server。如果其中一个进程死亡,它们都会重新启动。其次,你必须指定关机策略的超时时间 - 这将确保终止功能将被调用。

+0

这是有道理的...所以在这种情况下,可以使用trap_exit,因为gen_server不会链接到任何东西? – Stratus3D 2014-10-13 12:14:13

+0

在这种情况下,您可以忘记'trap_exit'。可以不使用它。当你可以使用主管时,通常最好不要使用它。 – tkowal 2014-10-13 13:24:04

3

Fron的DOC:

当trap_exit被设置为到达至过程被 转换为{“退出”,从,原因}消息,其可被接收作为 普通消息真,则退出信号。如果trap_exit设置为false,则会在 接收到非正常退出信号并且退出信号为 传播到其链接进程时退出进程。应用程序进程应该通常不会陷阱退出。

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

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