Concurrency 长生不老药/二郎和牛仔-如何使用
使用Mix创建应用程序时,它始终会将根管理器文件添加到项目中。请注意监督函数中的“子规范”数组是如何为空的 app.ex:Concurrency 长生不老药/二郎和牛仔-如何使用,concurrency,erlang,elixir,otp,erlang-supervisor,Concurrency,Erlang,Elixir,Otp,Erlang Supervisor,使用Mix创建应用程序时,它始终会将根管理器文件添加到项目中。请注意监督函数中的“子规范”数组是如何为空的 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
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\u link()的调用,它也可以工作
那么,在这种情况下,主管是干什么的?如果主管的子规范为空,那么它有什么意义
例如,在这里的长生不老药示例中,您可以看到启动主管的调用在第65行被注释掉
但是在一个官方的Cowboy Erlang示例中,这个文件--创建了一个类似的根管理器,没有子规范,然后在主应用程序文件中调用它,在第22行-有一个比管理树更高级别的概念: 一个项目通常由许多应用程序组成。它们中的每一个都可以有自己的监督树。如果您已使用wx小部件正确安装了Erlang和Elixir,则可以通过运行以下命令查看:
:observer.start
这将打开一个图形用户界面。转到应用程序
选项卡并单击右侧的应用程序名称。它仅显示遵循OTP原则的流程。如果您的示例与cowboy repository中的示例类似,那么您应该在ranch
下看到所有的接受者
工作人员列表为空的主管不执行任何操作。它就在那里,以防以后需要添加一些进程。启动它没有任何坏处,但也没有必要。可能是这样的,程序员在从模板开始项目后并不费心删除
有两种应用程序:
- 活动应用程序-使用流程完成其工作(例如ranch),它们应该作为一个单元启动和停止
- 库应用程序—只提供一些代码,这些代码在其他进程的上下文中运行(例如json解码器/编码器)