Elixir/Erlang和Cowboy - 如何使用主管

Cha*_*lie 8 concurrency erlang elixir erlang-otp erlang-supervisor

使用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
Run Code Online (Sandbox Code Playgroud)

还为您创建了应用程序的入口点.通过我在网上找到的一些例子,我写了以下内容:

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
Run Code Online (Sandbox Code Playgroud)

此应用程序的工作原理,但它也可以,如果我删除调用App.Supervisor.start_link()App.start() .

那么在这种情况下主管是什么?如果主管的孩子规格是空的,那么它有什么意义呢?

例如,在此处找到的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

tko*_*wal 9

有一个比监督树更高层次的概念:应用.

项目通常由许多应用程序组成.他们每个人都有自己的监督树.如果您使用wx小部件正确安装了Erlang和Elixir,则可以通过运行来查看它:

:observer.start
Run Code Online (Sandbox Code Playgroud)

这将打开一个图形用户界面.转到Applications选项卡,然后单击右侧的应用程序名称.它仅显示遵循OTP原则的流程.如果您的示例与牛仔存储库中的示例类似,那么您应该看到所有接受者ranch.

空工人列表的主管什么都不做.它就在那里,以防你以后需要添加一些进程.启动它没有任何伤害,但它也没有必要.情况可能就是这样,程序员在从模板开始项目之后就懒得删除.

有两种应用:

  • 活跃的应用程序 - 它们使用进程来完成它们的工作(例如牧场),它们应该作为一个单元启动和停止
  • 库应用程序 - 它只提供一些代码,在其他进程的上下文中运行(例如json解码器/编码器)

通常,活动应用程序具有顶级管理程序,而库应用程序则没有.