0

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

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

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

此外,如何使用gen_server在它的过程中保持状态。gen_server重启 时会导致复制状态操作吗?

谢谢

4

1 回答 1

1

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

这是我的理解:重启对于修复“Heisenbug”是有效的,只有在(Erlang)进程处于某种奇怪状态和/或试图处理“奇怪”消息时才会发生这种情况。

假设您恢复到已知的良好状态(通过重新启动),它应该正确处理所有正常消息。重启并不是为了“解决所有问题”,当然也不是为了配置错误或缺少互联网连接。通过这个定义,我们可以看到复制崩溃发生时的状态并尝试从中恢复是非常危险的,因为这违背了回到已知状态的全部意义。

第二点是,假设此过程仅在处理仅占所有用户实际使用的 0.001%(或任何被认为可以忽略不计的百分比)的操作时崩溃,并且它并不真正重要(例如次要的 UI 细节),那么完全可以让它崩溃并重新启动,不需要修复它。我认为它可以成为这些案例的生产力推动因素。


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

于 2018-11-07T11:45:50.240 回答