Elixir/Erlang and Cowboy - 如何使用主管
Elixir/Erlang and Cowboy - How to use supervisors
当您使用 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() 中的调用,它也有效.
那么在这种情况下主管的作用是什么?如果 supervisor 的 child spec 是空的,那么它有什么意义?
例如,在此处找到的 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 - Creates a similar root supervisor with no child spec, and then calls it in the main application file here, on line 22 - https://github.com/ninenines/cowboy/blob/master/examples/hello_world/src/hello_world_app.erl
还有比监督树更高级的概念:application.
一个项目通常由许多应用程序组成。他们每个人都可以有自己的监督树。如果你已经正确安装了 Erlang 和 Elixir 以及 wx widgets,你可以通过 运行ning:
查看它
:observer.start
这将打开一个图形用户界面。转到 Applications
选项卡并单击右侧的应用程序名称。它仅显示遵循 OTP 原则的进程。如果您的示例与 cowboy 存储库中的示例相似,那么您应该在 ranch
.
下看到所有接受器
工人列表为空的主管什么都不做。它就在那里,以防您以后需要添加一些流程。启动它没有任何害处,但也没有必要。可能是这样,程序员从模板开始项目后就懒得删除了。
有两种应用:
- 活跃的应用程序 - 使用进程来完成它们的工作(例如牧场),它们应该作为一个单元启动和停止
- 库应用程序 - 仅提供一些代码,即 运行 在其他进程的上下文中(例如 json decoders/encoders)
通常活跃的应用程序有顶级主管,而图书馆应用程序没有。
当您使用 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() 中的调用,它也有效.
那么在这种情况下主管的作用是什么?如果 supervisor 的 child spec 是空的,那么它有什么意义?
例如,在此处找到的 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 - Creates a similar root supervisor with no child spec, and then calls it in the main application file here, on line 22 - https://github.com/ninenines/cowboy/blob/master/examples/hello_world/src/hello_world_app.erl
还有比监督树更高级的概念:application.
一个项目通常由许多应用程序组成。他们每个人都可以有自己的监督树。如果你已经正确安装了 Erlang 和 Elixir 以及 wx widgets,你可以通过 运行ning:
查看它:observer.start
这将打开一个图形用户界面。转到 Applications
选项卡并单击右侧的应用程序名称。它仅显示遵循 OTP 原则的进程。如果您的示例与 cowboy 存储库中的示例相似,那么您应该在 ranch
.
工人列表为空的主管什么都不做。它就在那里,以防您以后需要添加一些流程。启动它没有任何害处,但也没有必要。可能是这样,程序员从模板开始项目后就懒得删除了。
有两种应用:
- 活跃的应用程序 - 使用进程来完成它们的工作(例如牧场),它们应该作为一个单元启动和停止
- 库应用程序 - 仅提供一些代码,即 运行 在其他进程的上下文中(例如 json decoders/encoders)
通常活跃的应用程序有顶级主管,而图书馆应用程序没有。