Concurrency 长生不老药/二郎和牛仔-如何使用

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

使用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_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解码器/编码器)
通常,活动应用程序有顶级主管,而库应用程序没有