Erlang世界不像往常一样使用try-catch。我想知道以主流语言重启进程与try-catch时的性能如何。
Erlang进程具有小的堆栈和堆概念,实际上是在OS堆中分配的。为什么重新启动有效?
希望有人让我深入了解Beam在进程上调用重启操作时该怎么做。
此外,如何使用gen_server
维护进程中的状态。 gen_server
重新启动时会导致复制状态运行吗?
谢谢
答案 0 :(得分:0)
我建议阅读https://ferd.ca/the-zen-of-erlang.html
我的理解是:重新启动对于修复“ Heisenbug”有效,仅当(Erlang)进程处于某种怪异状态和/或尝试处理“怪异”消息时才会发生。
推测是您恢复到已知的良好状态(通过重新启动),该状态应正确处理所有正常消息。重新启动并不是要“解决所有问题”,当然也不是因为配置错误或缺少互联网连接等原因。通过这个定义,我们可以看到在崩溃发生时复制状态并尝试从中恢复非常危险,因为这破坏了回到已知状态的全部目的。
第二点是,仅当处理仅占您所有用户实际使用的0.001%(或任何百分比可以忽略的百分比)的操作时,该过程才会崩溃,并且它并不是很重要(例如,较小的UI细节),完全可以让它崩溃并重新启动,并且无需修复。我认为这可以为这些情况带来生产力。
关于OP注释中的问题:是的,无论您的init
回调返回什么,您都可以在那里建立整个起始状态,也可以从其他地方获取,完全取决于用例。