【问题标题】:Elixir/Erlang and Cowboy - How to use supervisorsElixir/Erlang 和 Cowboy - 如何使用主管
【发布时间】:2016-04-20 04:09:40
【问题描述】:

当您使用 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

【问题讨论】:

    标签: concurrency erlang elixir erlang-otp erlang-supervisor


    【解决方案1】:

    还有一个比监督树更高层次的概念:application

    一个项目通常包含许多应用程序。他们每个人都可以有自己的监督树。如果你用 wx 小部件正确安装了 Erlang 和 Elixir,你可以通过运行看到它:

    :observer.start
    

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

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

    有两种应用:

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

    通常活动的应用程序具有顶级主管,而库应用程序则没有。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-29
      • 2014-07-09
      • 2014-09-27
      • 2015-12-06
      • 2013-10-22
      • 1970-01-01
      • 2020-03-30
      • 2018-04-24
      相关资源
      最近更新 更多