Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.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
Elixir 如何在一定时间后重新启动崩溃的受监控进程?_Elixir_Gen Server - Fatal编程技术网

Elixir 如何在一定时间后重新启动崩溃的受监控进程?

Elixir 如何在一定时间后重新启动崩溃的受监控进程?,elixir,gen-server,Elixir,Gen Server,我有一个简单的基于GenServer的应用程序,可以解析网页并播放从中获得的数据。代码大致如下所示: def start_link do GenServer.start_link(__MODULE__, %{}) end def init(state) do schedule_work(1) {:ok, state} end def handle_info(:work, state) do // Request webpage using HTTPoisson // Pa

我有一个简单的基于GenServer的应用程序,可以解析网页并播放从中获得的数据。代码大致如下所示:

def start_link do
  GenServer.start_link(__MODULE__, %{})
end

def init(state) do
  schedule_work(1)
  {:ok, state}
end

def handle_info(:work, state) do
  // Request webpage using HTTPoisson
  // Parse data using Floki
  // Use it

  schedule_work(10 * 60) # Reschedule after 10 minutes
  {:noreply, state}
end

defp schedule_work(timeout) do
  Process.send_after(self(), :work, timeout * 1000)
end
今天,第三方站点在一段时间内停止提供正确的标记,解析失败并使GenServer崩溃。主管重新启动了它,它立即崩溃了。
:max_重新启动后
主管最终停止了应用程序


我不想简单地增加
:max\u重新启动
。有没有办法告诉主管在一定时间后尝试重新启动?或者我应该在解析代码中做更多的错误处理来防止进程崩溃(我认为这违背了“让它崩溃”的理念)?

我认为最好的做法是更好地处理错误,更好地崩溃

您提到您不想简单地增加
max\u restarts
选项。您也可以降低
max_seconds
,默认值为5


此外,您还可以使用
Process.flag(:trap\u exit,true)
设置陷阱,并且在出现解析错误的情况下,使用特定消息退出(例如,
Process.exit(pid,:bad\u解析)
并使用它来重新安排时间。不过,这可能需要在您监督事情的方式上做一些更改。

不幸的是,这就是监督行为的实现方式。它不支持延迟重启,因此您可能需要自己实现自定义解决方案(强烈推荐,这样你会学到很多如何通过监视器或链接检测故障),或者你也可以使用。你也可以根据你的建议尝试一下。我在谷歌上搜索了一下,找到了这篇关于实现自定义监控器的文章:我用它了解了这一点,并实现了我的自定义监控器,这正是我想要的。谢谢!