我有一个主管,它启动了很多gen_server。每个gen_server都有很多数据加载需要花费很多时间。我想知道错误发生的时间,存储在gen_server状态的数据及其进程dict是否会保留下次启动,所以我不需要再次启动它们?
答案 0 :(得分:11)
Erlang行为的当前状态不会保存在任何地方。你必须自己照顾好。
您可以在外部(在另一个进程中,在ETS表中,数据库中等)将状态重新保存到某个位置,或者确保您的init/1
函数足够智能且动态,以便能够重新创建状态启动时(恢复现有文件,根据原始输入参数重新创建一些缓存等)。
基本上,您必须定义哪些数据应该在崩溃中存在以及如何保留或重新创建它。
答案 1 :(得分:1)
如果您的应用程序中有任何数据需要保持应用程序崩溃,那么您需要将其与应用程序分离到数据库(Mnesia)或ETS/DETS tables
。让gen_server状态包含 live/temporary/transient
信息,只允许它快速操作应用程序的瞬态。
一旦调用了gen_server init / 1,就让它读取配置文件或数据库以获得开始状态。通常,当您的应用程序非常依赖于服务器的最后状态时,每次进入操作gen_server状态的请求时,您都会从中提取信息并将其复制到持久存储中(并将此数据标记为先前已知状态) )。这使您的init / 1函数能够始终检查上一个/上一个状态或是否应该开始一个新状态。