我试图了解 OTP 和 erlang 中的主管(尽管我使用的是 elixir),但我似乎无法弄清楚为什么主主管树不会启动。
我正在用一个监听器工作人员制作一个 http 服务器,一个主管有处理程序(动态启动)。我可以自己启动每一个,如果侦听器是树中唯一的东西,我可以启动树。
这是 Elixir 中的主管定义
defmodule HTTPServer.Supervisor do
use Supervisor.Behaviour
def start_link(port) do
:supervisor.start_link({ :local, :sup }, __MODULE__, [port])
end
def init(port) do
tree = [
worker(HTTPServer.Listener, [port], id: :listener_sup),
supervisor(HTTPServer.HandlerSupervisor, [], shutdown: :infinity,
modules: [])
]
supervise(tree, strategy: :one_for_one)
end
end
defmodule HTTPServer.HandlerSupervisor do
use Supervisor.Behaviour
def start_link(_) do
IO.puts "starting handler supervisor"
:supervisor.start_link({ :local, :handler_sup }, __MODULE__, [])
end
def init(_) do
tree = [ worker(HTTPServer.Handler, [], restart: :temporary,
id: nil) ]
supervise(tree, strategy: :simple_one_for_one)
end
def start_child([socket]) do
IO.puts "starting handler child"
:supervisor.start_child(:handler_sup, [socket])
end
end
树中主管定义的某些内容是错误的,我不知道是什么,而且它似乎基本上是唯一阻碍我的项目的事情。
感谢您的帮助!