退出后如何才能获得孩子的状态?

时间:2014-12-16 21:04:53

标签: erlang

我正在制作一个程序,其中孩子具有某些值,但可以随时收到die消息,使其退出。此外,我有一个监控过程,将自己与孩子联系起来,检查他们是否还活着,抓住他们的出口。如果孩子死亡,监护仪将收到退出消息,重新注册孩子并在必要时使用相同的状态/值重新生成。监视器执行此操作,因此所有孩子都可以通过他们的注册名称找到,就像他们永远不会失败一样。

所以我的问题是:

  • 由于父母将孩子赶出现场,它是否仍然可以在孩子退出后与孩子联系,以获得当前的状态?或者孩子退出了吗?
  • 如何重新注册具有相同名称和值的孩子?我应该记录所有孩子的价值观,还是有其他办法通过一些Erlang魔法来检索这些价值观?

3 个答案:

答案 0 :(得分:1)

听起来你正在重新实现supervisor。如果不是出于教育目的,请阅读supervision

如果你只是在学习,那么这就是答案。你写了“父母被困儿童退出”。陷阱退出不起作用。进程只能为自己设置trap_exit标志。当其他某些进程尝试使用exit(Pid, Reason)终止它时,会使用它。调用process_flag(trap_exit, true)的进程将收到消息,而不是死亡。它甚至可能会忽略它并继续工作。

例如,您可以使用以下方式:child正在捕获退出,当有人试图将其关闭时,它会收到消息并调用exit({Reason, State})。这将确保监控过程获得有关其死亡通知的子状态。然后它可以重新生成具有初始状态的新进程并重新注册它。

要回答您的问题:您无法联系退出的流程。您必须生成新进程,提供先前的状态,然后再次注册。

答案 1 :(得分:1)

退出后仍可以与孩子联系 - >不会。一旦进程死亡,所有内容都会被erlang VM清理。

如何重新注册同名儿童 - >是的,如果流程真的死了,那么重复使用相同名称进行流程注册没有任何限制。事实上这是通常的情况。

如何重新注册具有相同值的孩子 - >没有简短的回答。

  • 首先,只有在ets或mnesia或任何外部平均值(流程外部)注册时,您才能获得此流程的状态 - 您将获得最后存储的值
  • 或者,如果您的流程捕获了骰子消息并发送回其自制主管"所有需要的信息。它会在你的设计中引入复杂性,并不是所有的死因都可以被捕获(至少杀戮信息不能)。
  • 最后:为什么这样做。听起来你应该处理你的应用程序的数据模型。有些数据属于您的应用程序,并且必须经历过程崩溃(客户帐户,订单......)。在大多数情况下,它应该存活到完整的应用程序停止或服务器崩溃。数据库(具有复制?)是为此而制作的。这些数据不是进程状态。另一方面,进程状态应该仅对当前生存进程有意义,它可以是套接字,一些引用,pids,一些超时......你应该注意从init参数重建所有内容,而不是尝试恢复以前的状态,只是因为它大部分时间都是过时的,也可能是因为其中一个数据可能是导致崩溃的原因。这种区别对于拥有一个没有副作用的代码(更容易调试和验证),以及坚持让它崩溃"用法。

答案 2 :(得分:0)

sys:get_state/1允许您访问仍在运行的进程的状态。如果进程正在对其状态中包含的数据执行重要操作,那么数据也应存储在其他位置 - 磁盘,数据库或其他进程(消息队列可能?)。 这可能是一个架构问题。您应该计划单个进程崩溃,并且您不需要选择要恢复的死进程的剩余部分。你没有提到主管,这可能是你应该考虑的事情。主管是容错和并发Erlang / OTP应用程序的重要组成部分。有关主管行为的文档,请访问:http://www.erlang.org/doc/man/supervisor.html

两个问题的答案:您应该考虑重新设计应用程序,以便主管处理重新启动的进程,然后可能创建另一个进程来管理不应丢失的数据/状态。