使用Mix创建应用程序时,它始终会将根管理程序文件添加到项目中。注意监督函数中的'child spec'数组是如何为空。
app.ex:
defmodule App.Supervisor do
use Supervisor
def start_link do
Supervisor.start_link(__MODULE__, :ok)
end
def init(args) do
supervise([], [strategy: :one_for_one])
end
end
还为您创建了应用程序的入口点。通过我在网上找到的一些例子,我写了以下内容:
defmodule App do
def start(_type, _args) do
dispatch = :cowboy_router.compile([
{
:_,
[
# Simple JSON test.
{"/test", app.Handle.test, []},
]
}
])
{:ok, _} = :cowboy.start_http(
:http,
100,
[{:port, 8080}],
[{ :env, [{:dispatch, dispatch}]}]
)
App.Supervisor.start_link()
end
end
此应用程序有效,但如果我在 App.start()中删除对 App.Supervisor.start_link()的调用,它也可以。
那么在这种情况下主管是什么?如果主管的子规格是空的,那么重点是什么?
例如,在此处找到的Elixir示例中 - https://github.com/IdahoEv/cowboy-elixir-example/blob/master/lib/cowboy_elixir_example.ex - 您可以看到启动主管的调用已在第65行注释掉。
但是在官方的Cowboy Erlang示例中,此文件 - https://github.com/ninenines/cowboy/blob/master/examples/hello_world/src/hello_world_app.erl - 创建一个没有子规范的类似根管理器,然后在第22行的主应用程序文件中调用它 - https://github.com/ninenines/cowboy/blob/master/examples/hello_world/src/hello_world_app.erl
答案 0 :(得分:7)
有一个比监督树更高层次的概念:application。
项目通常由许多应用程序组成。他们每个人都有自己的监督树。如果您使用wx小部件正确安装了Erlang和Elixir,则可以通过运行:
来查看它:observer.start
这将打开一个图形用户界面。转到Applications
标签,然后单击右侧的应用程序名称。它仅显示遵循OTP原则的流程。如果您的示例与牛仔存储库中的示例类似,那么您应该在ranch
下看到所有接受者。
具有空工作清单的主管什么都不做。它就在那里,以防你以后需要添加一些进程。启动它没有任何伤害,但它也没有必要。情况可能就是这样,程序员在从模板开始项目之后就懒得删除。
有两种应用程序:
通常,活动应用程序具有顶级管理程序,而库应用程序则没有。