gen_server重启策略复制状态?

Is gen_server restart strategy copy state?

Erlang 世界不像往常一样使用 try-catch。我想知道在主流语言中重新启动进程与 try-catch 时的性能如何。

Erlang 进程有它的小栈和堆概念,实际上在 OS 堆中分配。为什么重启有效呢?

希望有人能让我深入了解 Beam 在对进程调用重启操作时该怎么做。

此外,使用 gen_server 在其进程中维护状态如何。 gen_server重启时会导致复制状态操作吗?

谢谢

我建议阅读 https://ferd.ca/the-zen-of-erlang.html

这是我的理解:重启对于修复 "Heisenbug" 是有效的,只有当 (Erlang) 进程处于某种奇怪的状态 and/or 试图处理 "weird" 消息时才会发生。

假定您恢复到已知的良好状态(通过重新启动),这应该可以正确处理所有正常消息。重启并不意味着 "fix all the problems",当然也不是为了配置错误或缺少互联网连接之类的事情。根据这个定义,我们可以看到在崩溃发生时复制状态并尝试从中恢复是非常危险的,因为这违背了返回到已知状态的全部意义。

第二点是,假设此过程仅在处理仅占所有用户实际使用的 0.001%(或任何被认为可忽略的百分比)的操作时崩溃,并且它不是很重要(例如未成年人 UI detail) 然后让它崩溃并重新启动就完全没问题了,不需要修复它。我认为它可以提高这些情况的生产力。


关于您在 OP 评论中的问题:是的,无论您的 init 回调 returns,您都可以在那里构建整个起始状态或从其他地方获取来源,完全取决于用例.