我想在我的gen_server停止时执行一些代码。我有我的gen_server陷阱出口(我在init回调中添加了process_flag(trap_exit, true) )。这很好,因为terminate/2总是在进程退出之前被调用。我知道,由于我捕获出口,链接的进程崩溃了,不会使我创建的gen_server崩溃。我可以解决这个问题,但我想知道是否有其他方法可以替代使用process_flag(trap_exit, true)来实现这一点呢?
我只想要一个“在进程退出之前”回调。还有像这个出口这样的东西吗?
发布于 2014-10-12 20:42:37
@Pascal的回答是完全正确的,但我想提出另一个建议。
有时,您希望通过gen_server生成进程,但通常您可以将它们放到监督层次结构中,这要安全得多。您可以让相同的主管使用one_for_all重新启动策略生成这些进程和one_for_all。如果其中一个进程死亡,它们都会重新启动。其次,您必须指定关机策略的超时-这将确保终止函数将被调用。
发布于 2014-10-10 22:14:23
兄弟会医生
当trap_exit设置为true时,到达进程的退出信号将转换为{“退出”、“原因”}消息,这些消息可以作为普通消息接收。如果trap_exit设置为false,进程如果接收到正常以外的退出信号,并且退出信号被传播到其链接进程,则退出。应用程序进程通常不应该捕获出口。
这意味着,如果其链接进程中的任何一个异常死亡,设置为trap_exit标志为true的进程将不会退出。它必须有一个带有子句的接收块来捕获表单{'EXIT', From, Reason}的任何消息。在这个接收子句中,您可以在最终停止进程之前做您需要的事情。
在gen_server中,您必须编写一个回调Module:handle_info({'EXIT', From, Reason}, State) -> Result。
https://stackoverflow.com/questions/26305697
复制相似问题