在监督的任务中,Process.sleep出现奇怪的错误

时间:2016-09-13 23:31:51

标签: elixir

这个简单的代码不起作用

defmodule ElixirCluster do
  use Application

  def start(_type, _args) do
    import Supervisor.Spec, warn: false

    children = [
      worker(Task, [fn ->
        IO.puts("Hello")
        Process.sleep(1000) #:timer.sleep(1000)
        IO.puts("World")
      end])
    ]
    opts = [strategy: :one_for_one, name: ElixirCluster.Supervisor]
    Supervisor.start_link(children, opts)
  end
end

它只会打印Hello然后程序停止,它甚至不会重试,也不会打印World。我不知道这里有什么问题。

1 个答案:

答案 0 :(得分:2)

您很可能只使用mix来运行应用程序,它会在启动应用程序后立即停止VM,并且由于您在打印Hello后有1秒的睡眠时间,因此您永远不会执行打印{{1 }}。如果您使用World运行应用程序,则会在--no-halt之后看到World打印,并且该过程会在结束后立即重新启动:

Hello

请注意,Supervisor第4次放弃重新启动工作人员,并将自己杀死为default opts only restarts the worker 3 times within 5 seconds before giving up

  

$ mix run --no-halt Hello World Hello World Hello World Hello World 07:32:25.670 [info] Application elixir_cluster exited: shutdown - 时间范围内允许的最大重启次数。默认为:max_restarts。   3 - :max_seconds适用的时间范围。默认为:max_restarts

当你的任务需要每5秒重启5次。

如果您愿意,可以更改:

5

现在opts = [strategy: :one_for_one, name: ElixirCluster.Supervisor, max_restarts: 6, max_seconds: 5] 将继续永久打印。