Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Erlang 崩溃后如何恢复进程状态?_Erlang_Crash_State_Exit_Erlang Supervisor - Fatal编程技术网

Erlang 崩溃后如何恢复进程状态?

Erlang 崩溃后如何恢复进程状态?,erlang,crash,state,exit,erlang-supervisor,Erlang,Crash,State,Exit,Erlang Supervisor,重新启动崩溃进程时,保持状态的好方法是什么 我在OTP应用程序中有一个主管,负责监视几个“子系统”gen_服务器 例如,一个是“天气”子系统,它每15分钟生成一个新的天气状态,并处理当前天气状态的查询。(想想柠檬水摊位游戏) 如果gen_服务器崩溃,我希望它重新启动,但应该使用最新的天气状态重新启动,而不是在init()中硬编码的任意状态。仅仅因为飞机坠毁,模拟状态就突然从“冰雹风暴”变为“宜人微风”是没有意义的 我不太愿意在每次更新后使用mnesia或ETS来存储状态,因为这会增加复杂性;有更

重新启动崩溃进程时,保持状态的好方法是什么

我在OTP应用程序中有一个主管,负责监视几个“子系统”gen_服务器

例如,一个是“天气”子系统,它每15分钟生成一个新的天气状态,并处理当前天气状态的查询。(想想柠檬水摊位游戏)

如果gen_服务器崩溃,我希望它重新启动,但应该使用最新的天气状态重新启动,而不是在
init()
中硬编码的任意状态。仅仅因为飞机坠毁,模拟状态就突然从“冰雹风暴”变为“宜人微风”是没有意义的


我不太愿意在每次更新后使用mnesia或ETS来存储状态,因为这会增加复杂性;有更简单的方法吗?

只要在运行时使用,a建议使用ETS。其价值远远大于复杂性。API很简单,如果使用命名表,访问也很简单。您只需在主管启动gen_服务器之前创建表

两个更复杂的备选方案:

  • 构建一对流程,一个用于任务执行,一个用于状态维护。由于第二个简单,它将是真正可靠的
  • 一个真正愚蠢的做法可能是每次状态发生变化时,都以当前状态作为参数来交换主管的子规范(微笑)不,只是开玩笑
有没有更简单的方法

当进程终止时,它会向主管发送包含进程状态的消息,所以您可以使用此值存储在主管中(在mnesia或主管的状态中),并且当您的服务器将启动时(在init中),它必须向主管发送同步调用以获取状态值。我没有真正的例子,但我希望它有意义

无论如何,我并不认为在mnesia中存储状态有什么问题


抱歉,我的英语:)

主管应该尽可能少地包含逻辑,并且只负责重新启动。该逻辑中的一个错误可能导致整个子树崩溃。