我正在制作一个程序,其中孩子具有某些值,但可以随时收到die
消息,使其退出。此外,我有一个监控过程,将自己与孩子联系起来,检查他们是否还活着,抓住他们的出口。如果孩子死亡,监护仪将收到退出消息,重新注册孩子并在必要时使用相同的状态/值重新生成。监视器执行此操作,因此所有孩子都可以通过他们的注册名称找到,就像他们永远不会失败一样。
所以我的问题是:
答案 0 :(得分:1)
听起来你正在重新实现supervisor
。如果不是出于教育目的,请阅读supervision。
如果你只是在学习,那么这就是答案。你写了“父母被困儿童退出”。陷阱退出不起作用。进程只能为自己设置trap_exit
标志。当其他某些进程尝试使用exit(Pid, Reason)
终止它时,会使用它。调用process_flag(trap_exit, true)
的进程将收到消息,而不是死亡。它甚至可能会忽略它并继续工作。
例如,您可以使用以下方式:child正在捕获退出,当有人试图将其关闭时,它会收到消息并调用exit({Reason, State})
。这将确保监控过程获得有关其死亡通知的子状态。然后它可以重新生成具有初始状态的新进程并重新注册它。
要回答您的问题:您无法联系退出的流程。您必须生成新进程,提供先前的状态,然后再次注册。
答案 1 :(得分:1)
退出后仍可以与孩子联系 - >不会。一旦进程死亡,所有内容都会被erlang VM清理。
如何重新注册同名儿童 - >是的,如果流程真的死了,那么重复使用相同名称进行流程注册没有任何限制。事实上这是通常的情况。
如何重新注册具有相同值的孩子 - >没有简短的回答。
答案 2 :(得分:0)
sys:get_state/1
允许您访问仍在运行的进程的状态。如果进程正在对其状态中包含的数据执行重要操作,那么数据也应存储在其他位置 - 磁盘,数据库或其他进程(消息队列可能?)。 这可能是一个架构问题。您应该计划单个进程崩溃,并且您不需要选择要恢复的死进程的剩余部分。你没有提到主管,这可能是你应该考虑的事情。主管是容错和并发Erlang / OTP应用程序的重要组成部分。有关主管行为的文档,请访问:http://www.erlang.org/doc/man/supervisor.html
两个问题的答案:您应该考虑重新设计应用程序,以便主管处理重新启动的进程,然后可能创建另一个进程来管理不应丢失的数据/状态。