5

我有一个启动许多 gen_server 的主管。每个 gen_server 都有大量的数据负载,这需要很多时间。我想知道何时发生错误,存储在 gen_server 的状态及其进程字典中的数据是否会保留以备下次启动,这样我就不需要再次初始化它们了?

4

2 回答 2

11

Erlang 行为的当前状态不会保存在任何地方。你必须自己处理。

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

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

于 2011-07-30T10:04:54.527 回答
1

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

于 2011-07-30T12:00:44.607 回答