Erlang gen_服务器中的数据在其主管重新启动后是否会保留?

Erlang gen_服务器中的数据在其主管重新启动后是否会保留?,erlang,otp,Erlang,Otp,我有一个主管,负责启动许多gen_服务器。每个gen_服务器都有大量数据负载,这需要花费大量时间。我想知道当错误发生时,存储在gen_服务器状态中的数据及其进程记录是否会保留以供下次启动,这样我就不需要再次初始化它们了?Erlang行为的当前状态不会保存在任何位置。你得自己处理 要么定期将状态保存在外部某处(在另一个进程、ETS表、数据库等中),要么确保init/1函数足够智能和动态,能够在启动时重新创建状态(恢复现有文件、根据原始输入参数重新创建一些缓存等) 基本上,您必须定义哪些数据应该在崩

我有一个主管,负责启动许多gen_服务器。每个gen_服务器都有大量数据负载,这需要花费大量时间。我想知道当错误发生时,存储在gen_服务器状态中的数据及其进程记录是否会保留以供下次启动,这样我就不需要再次初始化它们了?

Erlang行为的当前状态不会保存在任何位置。你得自己处理

要么定期将状态保存在外部某处(在另一个进程、ETS表、数据库等中),要么确保
init/1
函数足够智能和动态,能够在启动时重新创建状态(恢复现有文件、根据原始输入参数重新创建一些缓存等)


基本上,您必须定义哪些数据应该在崩溃后幸存,以及如何保存或重新创建这些数据。

如果您的应用程序中有任何数据需要保存应用程序的崩溃,则需要将其从应用程序分离到数据库(Mnesia)或
ETS/DETS表中。让gen_服务器状态包含
实时/临时/瞬态
信息,只允许它快速操作应用程序的瞬态状态
一旦调用gen_server init/1,让它读取配置文件或数据库以获得开始状态。通常,当您的应用程序非常依赖于服务器的最后一个状态时,每次传入一个操作gen_服务器状态的请求时,您都会从中提取信息并将其复制到持久性存储中(并将此数据标记为以前已知的状态)。这使init/1函数能够始终检查上一个/上一个状态,或者它是否应该开始一个新状态

我要补充的唯一一点是:避免使用进程字典,尤其是存储大量状态。最好不要在任何时候使用它all@Peer:尤其是因为它不会持久保存任何数据,就像属于进程内存的所有其他数据一样。您可能还想读取。它讨论了不同类型的状态,并提出了解决问题的方法。