这个简单的代码不起作用
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
。我不知道这里有什么问题。
答案 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]
将继续永久打印。