我想在gen_server停止时执行一些代码。我有我的gen_server陷阱退出(我将process_flag(trap_exit, true)
添加到init回调中)。这很有效,因为在进程退出之前始终会调用terminate/2
。我知道,因为我正在捕获退出链接进程,崩溃不会导致我创建的gen_server崩溃。我可以解决这个问题,但我想知道是否有替代方法可以使用process_flag(trap_exit, true)
来实现这一目标?
我只想要一个“在进程退出之前”回调。还有其他类似的退出吗?
答案 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函数。