我有一个主管进程,它启动多个子进程。目前,当孩子死亡时,我会生成一个具有新 Pid 的新进程。这意味着我丢失了刚刚死亡的子进程的状态信息。我希望我的客户始终使用相同的标识符与子进程进行通信。尽管子进程可能会死亡并由主管重新启动。
我正在考虑使用唯一的名称注册子进程并将子状态存储在 ets 表中。问题是 - 在 Erlang 中解决此类问题的推荐方法是什么?
Thanks!
将进程状态存储在 ets 表中可以在崩溃之间保持状态,并且我通常使用全局注册表来为进程提供持久名称。 (玩家 200 将注册为 {player, 200}。)我不建议使用本地注册表,因为它要求您使用原子,并且如果您有很多子进程,您可以通过以下方式快速耗尽原子限制动态创建它们(如player_200、player_201等)
不过,将子状态存储在 ets 表中也有其自身的风险和问题。如果子进程在发生错误和保存到 ets 表之间发生崩溃,那么应该没问题。但是,如果您处理的数据导致子级保存垃圾状态,然后在处理下一条消息时崩溃,该怎么办?您将重新启动该进程,从 ets 表加载错误状态,并在收到下一条消息时再次崩溃。当然有一些方法可以解决这个问题,但您应该意识到这是一种可能性并解决它。
虽然 Erlang 隐藏了将 ets 表分配给所有进程的问题,但它是以 CPU 和潜在争用为代价的。如果您要对 ets 表进行大量更改,那么您将付出性能代价。
如果你的孩子崩溃了,你难道不应该为他们寻找一种方法来消除错误的情况吗?我通常会将进程崩溃视为我需要根本原因并修复的问题。 ?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)