0

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

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

4

2 回答 2

3

前文档:

当 trap_exit 设置为 true 时,到达进程的退出信号将转换为 {'EXIT', From, Reason} 消息,可以作为普通消息接收。如果 trap_exit 设置为 false,则进程在收到非正常退出信号时退出,并且退出信号传播到其链接的进程。应用程序进程通常不应捕获出口。

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

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

于 2014-10-10T22:14:23.153 回答
1

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

有时您想通过 生成进程gen_server,但通常可以将它们放在监督层次结构中,这样更安全。您可以拥有这些进程,并由具有重启策略gen_server的同一个主管生成。如果其中一个进程死亡,它们都会重新启动。其次,您必须为关闭策略指定超时- 这将确保调用终止函数。one_for_all

于 2014-10-12T20:42:37.980 回答